%# BEGIN BPS TAGGED BLOCK {{{
%#
%# COPYRIGHT:
%#
%# This software is Copyright (c) 1996-2021 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 &>

<form action="<%RT->Config->Get('WebPath')%>/Admin/Users/Modify.html" method="post" enctype="multipart/form-data" name="<% $Create ? 'UserCreate': 'UserModify' %>">
%if ($Create) {
<input type="hidden" class="hidden" name="id" value="new" />
% } else {
<input type="hidden" class="hidden" name="id" value="<%$UserObj->Id%>" />
% }
<div class="row">
  <div class="boxcontainer col-xl-6">

<&| /Widgets/TitleBox, title => loc('Identity'), class => 'user-info-identity' &>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Username</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Name" value="<%$UserObj->Name//$ARGS{Name}//''%>" /> <strong><&|/l&>(required)</&></strong>
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Email</&>:
    </div>
    <div class="value col-9">
      <input type="email" class="form-control" name="EmailAddress" value="<%$UserObj->EmailAddress//$ARGS{EmailAddress}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
       <&|/l&>Real Name</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="RealName" value="<%$UserObj->RealName//$ARGS{RealName}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Nickname</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="NickName" value="<%$UserObj->NickName//$ARGS{NickName}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Unix login</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Gecos" value="<%$UserObj->Gecos//$ARGS{Gecos}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Language</&>:
    </div>
    <div class="value col-9">
      <& /Elements/SelectLang, Name => 'Lang', Default => $UserObj->Lang//$ARGS{Lang} &>
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Timezone</&>:
    </div>
    <div class="value col-9">
      <& /Elements/SelectTimezone, Name => 'Timezone', Default => $UserObj->Timezone &>
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Extra info</&>:
    </div>
    <div class="value col-9">
      <textarea class="form-control" name="FreeformContactInfo" cols="20" rows="5"><%$UserObj->FreeformContactInfo//$ARGS{FreeformContactInfo}//''%></textarea>
    </div>
  </div>

<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Identity' &>
</&>

<&| /Widgets/TitleBox, title => loc('Access control'), class => 'user-info-access-control' &>
<input type="hidden" class="hidden" name="SetEnabled" value="1" />
  <div class="form-row">
    <div class="col-12">
      <div class="custom-control custom-checkbox">
        <input type="checkbox" class="custom-control-input checkbox" id="Enabled" name="Enabled" value="1" <% ($UserObj->Id && $UserObj->Disabled) ? '' : 'checked="checked"' |n%> />
        <label class="custom-control-label" for="Enabled"><&|/l&>Let this user access RT</&></label>
      </div>
    </div>
  </div>

% my $PrivilegedChecked = ((!$Create && $UserObj->Privileged()) or (!$UserObj->Id and $ARGS{Privileged})) ? 'checked="checked"' : '';
<input type="hidden" class="hidden" name="SetPrivileged" value="1" />
  <div class="form-row">
    <div class="col-12">
      <div class="custom-control custom-checkbox">
        <input type="checkbox" class="custom-control-input checkbox" id="Privileged" name="Privileged" value="1" <%$PrivilegedChecked|n%> />
        <label class="custom-control-label" for="Privileged"><&|/l&>Let this user be granted rights</&> (<&|/l&>Privileged</&>)</label>
      </div>
    </div>
  </div>

<& /Elements/EditPassword,
    User => $UserObj,
    Name => [qw(CurrentPass Pass1 Pass2)],
&>

<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Access control' &>

</&>
% $m->callback( %ARGS, CallbackName => 'LeftColumnBottom', UserObj => $UserObj );

  </div>  <!-- boxcontainer -->
  <div class="boxcontainer col-xl-6">

<&| /Widgets/TitleBox, title => loc('Location'), class => 'user-info-location' &>
  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Organization</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Organization" value="<%$UserObj->Organization//$ARGS{Organization}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Address1</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Address1" value="<%$UserObj->Address1//$ARGS{Address1}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Address2</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Address2" value="<%$UserObj->Address2//$ARGS{Address2}//''%>" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>City</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="City" value="<%$UserObj->City//$ARGS{City}//''%>" size="14" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>State</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="State" value="<%$UserObj->State//$ARGS{State}//''%>" size="3" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Zip</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Zip" value="<%$UserObj->Zip//$ARGS{Zip}//''%>" size="9" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Country</&>:
    </div>
    <div class="value col-9">
      <input type="text" class="form-control" name="Country" value="<%$UserObj->Country//$ARGS{Country}//''%>" />
    </div>
  </div>

<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Location' &>

</&>

<&| /Widgets/TitleBox, title => loc('Phone numbers'), class => 'user-info-phones' &>
  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Residence</&>:
    </div>
    <div class="value col-9">
      <input type="tel" class="form-control" name="HomePhone" value="<%$UserObj->HomePhone//$ARGS{HomePhone}//''%>" size="13" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Work</&>:
    </div>
    <div class="value col-9">
      <input type="tel" class="form-control" name="WorkPhone" value="<%$UserObj->WorkPhone//$ARGS{WorkPhone}//''%>" size="13" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Mobile</&>:
    </div>
    <div class="value col-9">
      <input type="tel" class="form-control" name="MobilePhone" value="<%$UserObj->MobilePhone//$ARGS{MobilePhone}//''%>" size="13" />
    </div>
  </div>

  <div class="form-row">
    <div class="label col-3">
      <&|/l&>Pager</&>:
    </div>
    <div class="value col-9">
      <input type="tel" class="form-control" name="PagerPhone" value="<%$UserObj->PagerPhone//$ARGS{PagerPhone}//''%>" size="13" />
    </div>
  </div>

<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Phones' &>

</&>

<& /Elements/EditCustomFieldCustomGroupings, Object => $UserObj &>

% unless ( $Create ) {
<& /User/Elements/RelatedData, UserObj => $UserObj &>
% }

% $m->callback( %ARGS, CallbackName => 'RightColumnBottom', UserObj => $UserObj );

  </div> <!-- boxcontainer -->
</div>   <!-- row -->

<&| /Widgets/TitleBox, title => loc('Comments about this user'), class => 'user-info-comments' &>
<textarea class="comments form-control" name="Comments" cols="80" rows="5" wrap="virtual"><%$UserObj->Comments//$ARGS{Comments}//''%></textarea>
</&>

%if (!$Create && $UserObj->Privileged) { 
<&| /Widgets/TitleBox, title => loc('Signature'), class => 'user-info-signature' &>
<div class="form-row">
  <div class="col-12">
    <textarea class="signature form-control" rows="5" name="Signature" wrap="hard"><%$UserObj->Signature//$ARGS{Signature}//''%></textarea>
  </div>
</div>
</&>
% }

% if ( $Create ) {
  <div class="form-row">
    <div class="col-12">
      <& /Elements/Submit, Label => loc('Create') &>
    </div>
  </div>
% } else {
  <div class="form-row">
    <div class="col-12">
      <& /Elements/Submit, Label => loc('Save Changes') &>
    </div>
  </div>
% }
</form>

% if ( $UserObj->Id ) {
<div id="user-info-modal" class="modal">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content p-2">
      <div class="modal-header">
        <h5 class="modal-title"><&|/l&>Anonymize User</&></h5>
        <a class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </a>
      </div>
      <div class="modal-body">
        <form id="user-info-modal-form" action="<% RT->Config->Get('WebPath') %>/Admin/Users/Modify.html" method="POST">
          <input type="hidden" name="id" value="<% $UserObj->Id %>" />
          <input type="hidden" name="Anonymize" value="1" />

          <div class="form-row">
            <div class="custom-control custom-checkbox">
              <input class="custom-control-input" type="checkbox" id="clear_customfields" name="clear_customfields" />
              <label class="custom-control-label" for="clear_customfields"><&|/l&>Check to clear user custom fields</&></label>
            </div>
          </div>
        </div>

        <div class="form-row justify-content-end">
          <div class="col-auto">
            <button type="Submit" class="button"><&|/l&>Anonymize</&></button>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
% }
<%INIT>

my $UserObj = RT::User->new($session{'CurrentUser'});
my ($title, @results);

my ($val, $msg);

$ARGS{Privileged} = $ARGS{Privileged} ? 1 : 0;
delete $ARGS{Privileged} unless $ARGS{SetPrivileged};

$ARGS{Disabled} = $ARGS{Enabled} ? 0 : 1;
delete $ARGS{Disabled} unless $ARGS{SetEnabled};

my @fields = qw(Name Comments Signature EmailAddress FreeformContactInfo
                Organization RealName NickName Lang Gecos HomePhone WorkPhone
                MobilePhone PagerPhone Address1 Address2 City State Zip Country
                Timezone
               );

if ($Create) {
    $title = loc("Create a new user");
} elsif ( defined $id && $id eq 'new') {
    $m->callback( CallbackName => 'BeforeCreate', ARGSRef => \%ARGS, Fields => \@fields, Results => \@results );
    ( $val, $msg ) = $UserObj->Create(
        (map {($_ => $ARGS{$_})} @fields),
        Privileged => $ARGS{'Privileged'},
        Disabled   => $ARGS{'Disabled'},
    );

    if ($val) {
        push @results, $msg;
        push @results, ProcessObjectCustomFieldUpdates( ARGSRef => \%ARGS, Object => $UserObj );
        $title = loc("Modify the user [_1]", $UserObj->Name);
    } else {
        push @results, loc('User could not be created: [_1]', $msg);
        $title = loc("Create a new user");
        $Create = 1;
    }
} else {
    $UserObj->Load($id) || $UserObj->Load($ARGS{Name})
        || Abort("Couldn't load user '" . ( $ARGS{Name} || '') . "'");

    $title = loc("Modify the user [_1]", $UserObj->Name);

    $m->callback( %ARGS, CallbackName => 'BeforeUpdate', User => $UserObj, ARGSRef => \%ARGS, Results => \@results );

    my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields,
                                            Object => $UserObj,
                                            ARGSRef => \%ARGS );
    push (@results,@fieldresults);
    push @results, ProcessObjectCustomFieldUpdates( ARGSRef => \%ARGS, Object => $UserObj );

    if ( defined $ARGS{Privileged} and $ARGS{Privileged} != ($UserObj->Privileged || 0) ) {
        my ($code, $msg) = $UserObj->SetPrivileged($ARGS{Privileged});
        push @results, loc('Privileged status: [_1]', loc_fuzzy($msg));
    }

    if ( defined $ARGS{Disabled} and $ARGS{Disabled} != $UserObj->Disabled ) {
        my ($code, $msg) = $UserObj->SetDisabled($ARGS{Disabled});
        push @results, $msg;
    }
}

if ( $ARGS{'Anonymize'} and $UserObj->Id ) {
    my ($ret, $msg) = $UserObj->AnonymizeUser(ClearCustomFields => $ARGS{'clear_customfields'});
    push @results, $msg;
}

if ( $UserObj->Id ) {
    # Deal with Password field
    my ($status, $msg) = $UserObj->SafeSetPassword(
        Current      => $CurrentPass,
        New          => $Pass1,
        Confirmation => $Pass2,
    );
    push @results, $msg;

    if ( $id eq 'new' && !$status ) {
        push @results, loc("A password was not set, so user won't be able to login.");
    }
}

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

</%INIT>


<%ARGS>
$id => undef
$CurrentPass => undef
$Pass1 => undef
$Pass2 => undef
$Create=> undef
</%ARGS>
