%# BEGIN BPS TAGGED BLOCK {{{
-%#
+%#
%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
-%# <jesse@bestpractical.com>
-%#
+%#
+%# This software is Copyright (c) 1996-2017 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
%# 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 }}}
-<& /Elements/Header, Title=>loc("Preferences") &>
-<& /User/Elements/Tabs,
- current_tab => 'User/Prefs.html',
- Title => loc("Preferences") &>
+<& /Elements/Header, Title=>loc("Ticketing Preferences") &>
+<& /Elements/Tabs &>
<& /Elements/ListActions, actions => \@results &>
<td class="label"><&|/l&>Nickname</&>:</td>
<td class="value"><input name="NickName" value="<%$UserObj->NickName || ''%>" /></td>
</tr>
- <tr>
- <td class="label"><&|/l&>Language</&>:</td>
- <td class="value"><& /Elements/SelectLang, Name => 'Lang', Default => $UserObj->Lang &></td>
- </tr>
+%# <tr>
+%# <td class="label"><&|/l&>Language</&>:</td>
+%# <td class="value"><& /Elements/SelectLang, Name => 'Lang', Default => $UserObj->Lang &></td>
+%# </tr>
<tr>
<td class="label"><&|/l&>Timezone</&>:</td>
<td class="value"><& /Elements/SelectTimezone, Name => 'Timezone', Default => $UserObj->Timezone &></td>
</tr>
+<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Identity', InTable => 1 &>
</table>
</&>
<&| /Widgets/TitleBox, title => loc('Phone numbers'), id => "user-prefs-phone" &>
<td class="label"><&|/l&>Pager</&>:</td>
<td class="value"><input name="PagerPhone" value="<%$UserObj->PagerPhone || ''%>" size="13" /></td>
</tr>
+<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Phones', InTable => 1 &>
</table>
</&>
+
+%if ($UserObj->Privileged) {
+<&| /Widgets/TitleBox, title => loc('Signature'), id => "user-prefs-signature" &>
+<textarea cols="80" rows="5" name="Signature" class="signature" wrap="hard">
+<%$UserObj->Signature || ''%></textarea>
+</&>
+% }
+
% $m->callback( %ARGS, UserObj => $UserObj, CallbackName => 'FormLeftColumn' );
</td>
<td valign="top" class="boxcontainer">
-% unless (RT->Config->Get('WebExternalAuth') and !RT->Config->Get('WebFallbackToInternalAuth')) {
+
<&| /Widgets/TitleBox, title => loc('Password'), id => "user-prefs-password" &>
-<table>
-<tr>
-<td class="label">
-<&|/l&>New Password</&>:
-</td>
-<td class="value">
-<input type="password" name="Pass1" autocomplete="off"/>
-</td>
-</tr>
-<tr><td class="label">
-<&|/l&>Retype Password</&>:
-</td>
-<td class="value">
-<input type="password" name="Pass2" autocomplete="off" />
-</td>
-</tr>
-</table>
+<& /Elements/EditPassword,
+ User => $UserObj,
+ Name => [qw(CurrentPass Pass1 Pass2)],
+&>
+
+<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Access control' &>
+
</&>
-% }
<&| /Widgets/TitleBox, title => loc('Location'), id => "user-prefs-location" &>
<table cellspacing="0" cellpadding="0">
<td class="label"><&|/l&>Country</&>:</td>
<td class="value"><input name="Country" value="<%$UserObj->Country || ''%>" /></td>
</tr>
+<& /Elements/EditCustomFields, Object => $UserObj, Grouping => 'Location', InTable => 1 &>
</table>
</&>
-<&| /Widgets/TitleBox, title => loc('Custom Fields') &>
-<table>
-% my $CustomFields = $UserObj->CustomFields;
-% while ( my $CF = $CustomFields->Next ) {
-<tr valign="top">
-<td align="right"><% loc( $CF->Name ) %>:</td>
-<td><& /Elements/EditCustomField,
- %ARGS, Object => $UserObj, CustomField => $CF
-&></td></tr>
-% }
-</table>
-</&>
-% $m->callback( %ARGS, UserObj => $UserObj, CallbackName => 'FormRightColumn' );
-</td>
-</tr>
+<& /Elements/EditCustomFieldCustomGroupings, Object => $UserObj &>
-<tr><td colspan="2" valign="top" class="boxcontainer">
-%if ($UserObj->Privileged) {
-<br />
-<&| /Widgets/TitleBox, title => loc('Signature') &>
-<textarea cols="80" rows="5" name="Signature" class="signature" wrap="hard">
-<%$UserObj->Signature || ''%></textarea>
-</&>
-% }
-</td></tr>
-<tr><td colspan="2" valign="top" class="boxcontainer">
+
+<& /Elements/Submit, Label => loc('Save Preferences') &>
+
<&| /Widgets/TitleBox, title => loc('Secret authentication token'), id => "user-prefs-feeds" &>
-<&|/l&><p>All iCal feeds embed a secret token which authorizes you. If the URL one of your iCal feeds got exposed to the outside world, you can get a new secret, <b>breaking all existing iCal feeds</b> below.</p></&>
+<&|/l&>All iCal feeds embed a secret token which authorizes you. If the URL for one of your iCal feeds was exposed to the outside world, you can get a new secret, <b>breaking all existing iCal feeds</b>, below.</&>
-<& /Elements/Submit, Label => loc('Reset secret authentication token'), Name => "ResetAuthToken" &>
+<a href="#" id="ResetAuthTokenPrompt" style="display: none">
+ <&|/l&>I want to reset my secret token.</&>
+</a>
+<& /Elements/Submit,
+ Label => loc('Reset secret authentication token'),
+ Name => "ResetAuthToken",
+ id => "ResetAuthTokenContainer" &>
+<script>
+ jQuery("#ResetAuthTokenContainer").hide();
+ jQuery("#ResetAuthTokenPrompt").show().click(function(ev){
+ jQuery(this).slideUp();
+ jQuery("#ResetAuthTokenContainer").slideDown();
+ ev.preventDefault();
+ });
+</script>
</&>
-</td></tr>
+
+% $m->callback( %ARGS, UserObj => $UserObj, CallbackName => 'FormRightColumn' );
+</td>
+</tr>
</table>
% $m->callback( %ARGS, UserObj => $UserObj, CallbackName => 'FormEnd' );
-<& /Elements/Submit, Label => loc('Save Preferences') &>
</form>
if $Name;
Abort(loc("Couldn't load user"));
}
+$id = $UserObj->id;
my @results;
-my @fields = qw(
- Name Comments Signature EmailAddress FreeformContactInfo
- Organization RealName NickName Lang EmailEncoding WebEncoding
- ExternalContactInfoId ContactInfoSystem Gecos ExternalAuthId
- AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1
- Address2 City State Zip Country Lang Timezone
-);
+if ( $ARGS{'ResetAuthToken'} ) {
+ my ($status, $msg) = $UserObj->GenerateAuthToken;
+ push @results, $msg;
+}
+else {
+ my @fields = qw(
+ Name Comments Signature EmailAddress FreeformContactInfo
+ Organization RealName NickName Lang EmailEncoding WebEncoding
+ ExternalContactInfoId ContactInfoSystem Gecos ExternalAuthId
+ AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1
+ Address2 City State Zip Country Timezone
+ );
-$m->callback(
- CallbackName => 'UpdateLogic',
- fields => \@fields,
- results => \@results,
- UserObj => $UserObj,
- ARGSRef => \%ARGS,
-);
+ $m->callback(
+ CallbackName => 'UpdateLogic',
+ fields => \@fields,
+ results => \@results,
+ UserObj => $UserObj,
+ ARGSRef => \%ARGS,
+ );
-push @results, UpdateRecordObject (
- AttributesRef => \@fields,
- Object => $UserObj,
- ARGSRef => \%ARGS,
-);
+ push @results, UpdateRecordObject (
+ AttributesRef => \@fields,
+ Object => $UserObj,
+ ARGSRef => \%ARGS,
+ );
-push @results, ProcessObjectCustomFieldUpdates( ARGSRef => \%ARGS, Object => $UserObj );
+ push @results, ProcessObjectCustomFieldUpdates( ARGSRef => \%ARGS, Object => $UserObj );
-if ( $Lang ) {
- $session{'CurrentUser'}->LanguageHandle($Lang);
- $session{'CurrentUser'} = $session{'CurrentUser'}; # force writeback
-}
+ # Deal with special fields: Privileged, Enabled, and Password
+ if ( $SetPrivileged and $Privileged != $UserObj->Privileged ) {
+ my ($code, $msg) = $UserObj->SetPrivileged( $Privileged );
+ push @results, loc('Privileged status: [_1]', loc_fuzzy($msg));
+ }
-# Deal with special fields: Privileged, Enabled, and Password
-if ( $SetPrivileged and $Privileged != $UserObj->Privileged ) {
- my ($code, $msg) = $UserObj->SetPrivileged( $Privileged );
- push @results, loc('Privileged status: [_1]', loc_fuzzy($msg));
+ my %password_cond = $UserObj->CurrentUserRequireToSetPassword;
+ if (defined $Pass1 && length $Pass1 ) {
+ my ($status, $msg) = $UserObj->SafeSetPassword(
+ Current => $CurrentPass,
+ New => $Pass1,
+ Confirmation => $Pass2,
+ );
+ push @results, loc("Password: [_1]", $msg);
+ }
}
-#TODO: make this report errors properly
-if ( defined $Pass1 and length $Pass1 and $Pass1 eq $Pass2 and !$UserObj->IsPassword($Pass1) ) {
- my ($code, $msg);
- ($code, $msg) = $UserObj->SetPassword($Pass1);
- push @results, loc('Password: [_1]', loc_fuzzy($msg));
-} elsif ( defined $Pass1 && length $Pass1 && $Pass1 ne $Pass2 ) {
- push @results, loc("Passwords do not match. Your password has not been changed");
-}
-if ( $ARGS{'ResetAuthToken'} ) {
- my ($status, $msg) = $UserObj->GenerateAuthToken;
- push @results, $msg;
-}
+MaybeRedirectForResults(
+ Actions => \@results,
+);
</%INIT>
$State => undef
$Zip => undef
$Country => undef
+$CurrentPass => undef
$Pass1 => undef
-$Pass2=> undef
+$Pass2 => undef
$Create=> undef
</%ARGS>