version 1.196.4.29, 2024/07/04 23:13:07
|
version 1.241, 2022/09/08 01:41:13
|
Line 31
|
Line 31
|
package Apache::lonpreferences; |
package Apache::lonpreferences; |
|
|
use strict; |
use strict; |
use LONCAPA; |
|
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
use Apache::File; |
use Apache::File; |
use Apache::loncommon(); |
use Apache::loncommon(); |
Line 40 use Apache::lonlocal;
|
Line 39 use Apache::lonlocal;
|
use Apache::lonnet; |
use Apache::lonnet; |
use LONCAPA::lonauthcgi(); |
use LONCAPA::lonauthcgi(); |
use LONCAPA(); |
use LONCAPA(); |
|
use DateTime::TimeZone(); |
|
|
################################################################ |
################################################################ |
# Handler subroutines # |
# Handler subroutines # |
Line 165 sub texenginechanger {
|
Line 165 sub texenginechanger {
|
my %mathchoices=('' => 'Default', |
my %mathchoices=('' => 'Default', |
'tth' => 'tth (TeX to HTML)', |
'tth' => 'tth (TeX to HTML)', |
#'ttm' => 'TeX to MathML', |
#'ttm' => 'TeX to MathML', |
'MathJax' => 'MathJax', |
'MathJax' => 'MathJax', |
'mimetex' => 'mimetex (Convert to Images)', |
'mimetex' => 'mimetex (Convert to Images)', |
'raw' => 'Raw (Screen Reader)' |
'raw' => 'Raw (Screen Reader)' |
); |
); |
Line 182 sub texenginechanger {
|
Line 182 sub texenginechanger {
|
'change' => 'Save', |
'change' => 'Save', |
'exmpl' => 'Examples', |
'exmpl' => 'Examples', |
'mathjax' => 'MathJax:', |
'mathjax' => 'MathJax:', |
'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.', |
'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.', |
'tth' => 'tth (TeX to HTML):', |
'tth' => 'tth (TeX to HTML):', |
'mimetex' => 'mimetex (Convert to Images):', |
'mimetex' => 'mimetex (Convert to Images):', |
); |
); |
Line 280 sub rolesprefchanger {
|
Line 280 sub rolesprefchanger {
|
my $hotlist_n=$userenv{'recentrolesn'}; |
my $hotlist_n=$userenv{'recentrolesn'}; |
my ($checkedon,$checkedoff); |
my ($checkedon,$checkedoff); |
if ($hotlist_flag) { |
if ($hotlist_flag) { |
$checkedon = 'checked="checked"'; |
$checkedon = 'checked="checked"'; |
} else { |
} else { |
$checkedoff = 'checked="checked"'; |
$checkedoff = 'checked="checked"'; |
} |
} |
Line 683 sub verify_and_change_clicker {
|
Line 683 sub verify_and_change_clicker {
|
my $r = shift; |
my $r = shift; |
my $user = $env{'user.name'}; |
my $user = $env{'user.name'}; |
my $domain = $env{'user.domain'}; |
my $domain = $env{'user.domain'}; |
|
my $uhome = $env{'user.home'}; |
my $newclickers = $env{'form.clickers'}; |
my $newclickers = $env{'form.clickers'}; |
|
my $message; |
$newclickers=~s/[^\w\:\-]+/\,/gs; |
$newclickers=~s/[^\w\:\-]+/\,/gs; |
$newclickers=~tr/a-z/A-Z/; |
$newclickers=~tr/a-z/A-Z/; |
$newclickers=~s/[\:\-]+/\-/g; |
$newclickers=~s/[\:\-]+/\-/g; |
$newclickers=~s/\,+/\,/g; |
$newclickers=~s/\,+/\,/g; |
$newclickers=~s/^\,//; |
$newclickers=~s/^\,//; |
$newclickers=~s/\,$//; |
$newclickers=~s/\,$//; |
&Apache::lonnet::put('environment',{'clickers' => $newclickers}); |
my @oldclickers = split(/,/,$env{'environment.clickers'}); |
&Apache::lonnet::appenv({'environment.clickers' => $newclickers}); |
my @newclickers = split(/,/,$newclickers); |
my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers)); |
my %newuniq; |
|
map { $newuniq{$_} = 1; } @newclickers; |
|
@newclickers = sort(keys(%newuniq)); |
|
my @differences = &Apache::loncommon::compare_arrays(\@oldclickers,\@newclickers); |
|
if (@differences) { |
|
my $putres = &Apache::lonnet::put('environment',{'clickers' => $newclickers}); |
|
if ($putres eq 'ok') { |
|
my @adds = (); |
|
my @dels = (); |
|
foreach my $item (@differences) { |
|
if (grep(/^\Q$item\E$/,@newclickers)) { |
|
push(@adds,$item); |
|
} else { |
|
push(@dels,$item); |
|
} |
|
} |
|
if (@dels) { |
|
my %delclicker; |
|
map { $delclicker{$_} = $user; } @dels; |
|
my $putresult = &Apache::lonnet::iddel($domain,\%delclicker,$uhome,'clickers'); |
|
} |
|
if (@adds) { |
|
my %addclicker; |
|
map { $addclicker{$_} = $user; } @adds; |
|
my $putresult = &Apache::lonnet::updateclickers($domain,'add',\%addclicker,$uhome,1); |
|
} |
|
&Apache::lonnet::appenv({'environment.clickers' => $newclickers}); |
|
$message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers)); |
|
} else { |
|
$message=&Apache::lonhtmlcommon::confirm_success(&mt('Error saving clicker ID').1); |
|
} |
|
} else { |
|
$message='<span class="LC_info">'.&mt('Clicker information unchanged').'</span>'; |
|
} |
$message=&Apache::loncommon::confirmwrapper($message); |
$message=&Apache::loncommon::confirmwrapper($message); |
&print_main_menu($r, $message); |
&print_main_menu($r, $message); |
} |
} |
Line 1142 sub colorschanger {
|
Line 1177 sub colorschanger {
|
foreach my $item (sort(keys(%colortypes))) { |
foreach my $item (sort(keys(%colortypes))) { |
my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain); |
my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain); |
$chtable.=&Apache::loncommon::start_data_table_row(). |
$chtable.=&Apache::loncommon::start_data_table_row(). |
'<td>'.$colortypes{$item}.'<td><input name="'.$item. |
'<td>'.$colortypes{$item}.'<td><input name="'.$item. |
'" class="colorchooser" size="10" value="'.$curcol. |
'" class="colorchooser" size="10" value="'.$curcol. |
'" /></td>'. |
'" /></td>'. |
&Apache::loncommon::end_data_table_row()."\n"; |
&Apache::loncommon::end_data_table_row()."\n"; |
} |
} |
my $end_data_table = &Apache::loncommon::end_data_table(); |
my $end_data_table = &Apache::loncommon::end_data_table(); |
my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); |
my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); |
Line 1197 sub verify_and_change_colors {
|
Line 1232 sub verify_and_change_colors {
|
my $message=''; |
my $message=''; |
foreach my $item (keys(%colortypes)) { |
foreach my $item (keys(%colortypes)) { |
my $color=$env{'form.'.$item}; |
my $color=$env{'form.'.$item}; |
if (!($color =~ /^#/)) { |
if (!($color =~ /^#/)) { |
$color = '#' . $color; |
$color = '#' . $color; |
} |
} |
my $entry='color.'.$function.'.'.$item; |
my $entry='color.'.$function.'.'.$item; |
if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) { |
if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) { |
&Apache::lonnet::put('environment',{$entry => $color}); |
&Apache::lonnet::put('environment',{$entry => $color}); |
Line 1285 sub passwordchanger {
|
Line 1320 sub passwordchanger {
|
} else { |
} else { |
$r->print( |
$r->print( |
'<p class="LC_warning">' |
'<p class="LC_warning">' |
.&mt('Sorry, the URL generated when you requested reset of' |
.&mt('Sorry, the URL generated when you requested reset of' |
.' your password contained incomplete information.') |
.' your password contained incomplete information.') |
.'</p>' |
.'</p>' |
); |
); |
return; |
return; |
} |
} |
Line 1402 sub jscript_send {
|
Line 1437 sub jscript_send {
|
var posspass = this.document.client.elements.newpass_1.value; |
var posspass = this.document.client.elements.newpass_1.value; |
if (min > 0) { |
if (min > 0) { |
if (posspass.length < min) { |
if (posspass.length < min) { |
errors.push("$js_lt{'short'}"); |
errors.push("$js_lt{'short'}"); |
} |
} |
} |
} |
if (currauth == 'internal:') { |
if (currauth == 'internal:') { |
Line 1431 sub jscript_send {
|
Line 1466 sub jscript_send {
|
} else if (rules[i] == 'spec') { |
} else if (rules[i] == 'spec') { |
var pattern = /^[!@#$%^&*()_+\\-=\\[\\]{};':"\\\|,.<a>\\/?]/; |
var pattern = /^[!@#$%^&*()_+\\-=\\[\\]{};':"\\\|,.<a>\\/?]/; |
if (!posspass.match(pattern)) { |
if (!posspass.match(pattern)) { |
errors.push("$js_lt{'spec'}"); |
errors.push("$js_lt{'spec'}"); |
} |
} |
} |
} |
} |
} |
Line 1725 ENDERROR
|
Line 1760 ENDERROR
|
} else { |
} else { |
my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1); |
my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1); |
if ($warning) { |
if ($warning) { |
&passwordchanger($r,'<span class="LC_warning">'. |
&passwordchanger($r,'<span class="LC_warning">'. |
$warning. |
$warning. |
&mt('Please try again.').'</span>', |
&mt('Please try again.').'</span>', |
$caller,$mailtoken,$timelimit,$extrafields); |
$caller,$mailtoken,$timelimit,$extrafields); |
if ($caller eq 'reset_by_email') { |
if ($caller eq 'reset_by_email') { |
return 'rules'; |
return 'rules'; |
} else { |
} else { |
Line 2183 sub verify_and_change_lockednames {
|
Line 2218 sub verify_and_change_lockednames {
|
&print_main_menu($r,$message); |
&print_main_menu($r,$message); |
} |
} |
|
|
|
sub timezonechanger { |
|
my $r = shift; |
|
my $uname = $env{'user.name'}; |
|
my $udom = $env{'user.domain'}; |
|
if (&Apache::lonnet::usertools_access($uname,$udom,'timezone')) { |
|
my $js = <<"ENDSCRIPT"; |
|
<script type-"text/javascript"> |
|
// <![CDATA[ |
|
function toggleTZdisplay(form) { |
|
var radioname = 'settimezone'; |
|
var divid = 'LC_timezone_selector'; |
|
var num = form.elements[radioname].length; |
|
if (num) { |
|
var setvis = ''; |
|
for (var i=0; i<num; i++) { |
|
if (form.elements[radioname][i].checked) { |
|
if (form.elements[radioname][i].value == '1') { |
|
if (document.getElementById(divid)) { |
|
document.getElementById(divid).style.display = 'inline-block'; |
|
} |
|
setvis = 1; |
|
} |
|
break; |
|
} |
|
} |
|
if (!setvis) { |
|
if (document.getElementById(divid)) { |
|
document.getElementById(divid).style.display = 'none'; |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
// ]]> |
|
</script> |
|
ENDSCRIPT |
|
my %loaditems = ( |
|
onload => 'javascript:toggleTZdisplay(document.prefs);', |
|
); |
|
my $args = { 'add_entries' => \%loaditems }; |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{ href => '/adm/preferences?action=', |
|
text => 'Set Your Time Zone'}); |
|
$r->print(Apache::loncommon::start_page('Set Your Time Zone',$js,$args)); |
|
$r->print(Apache::lonhtmlcommon::breadcrumbs('Set Your Time Zone')); |
|
my %userenv = &Apache::lonnet::get('environment',['timezone']); |
|
my $timezone = $userenv{'timezone'}; |
|
my %lt = &Apache::lonlocal::texthash( |
|
lctz => 'Use Time Zone set by LON-CAPA', |
|
owntz => 'Use Time Zone set by you', |
|
save => 'Save', |
|
); |
|
my (%checked,$tzsty); |
|
if ($userenv{'timezone'} ne '') { |
|
$checked{'owntz'} = ' checked="checked"'; |
|
$tzsty = 'inline-block'; |
|
} else { |
|
$checked{'lctz'} = ' checked="checked"'; |
|
$tzsty = 'none'; |
|
} |
|
my $onclick = ' onclick="javascript:toggleTZdisplay(this.form);"'; |
|
my $selector = &Apache::loncommon::select_timezone('timezone',$timezone,undef,1); |
|
$r->print(<<"END"); |
|
<form name="prefs" action="/adm/preferences" method="post"> |
|
<input type="hidden" name="action" value="verify_and_change_timezone" /> |
|
<span class="LC_nobreak"> |
|
<label><input type="radio" name="settimezone" value="0"$checked{'lctz'}$onclick /> |
|
$lt{'lctz'}</label> |
|
<label><input type="radio" name="settimezone" value="1"$checked{'owntz'}$onclick /> |
|
$lt{'owntz'}</label><div style="display:$tzsty" id="LC_timezone_selector"> |
|
$selector |
|
</div></span><br /><br /> |
|
<input type="submit" value="$lt{'save'}" /> |
|
</form> |
|
END |
|
} |
|
return; |
|
} |
|
|
|
sub verify_and_change_timezone { |
|
my $r = shift; |
|
my $currtimezone = $env{'environment.timezone'}; |
|
my $newtimezone; |
|
if ($env{'form.settimezone'}) { |
|
$newtimezone = $env{'form.timezone'}; |
|
if (DateTime::TimeZone->is_valid_name($env{'form.timezone'})) { |
|
$newtimezone = $env{'form.timezone'}; |
|
} |
|
} |
|
my $message=''; |
|
if ($newtimezone) { |
|
if ($newtimezone eq $currtimezone) { |
|
$message = &mt('Time Zone settings unchanged'); |
|
} else { |
|
&Apache::lonnet::put('environment',{'timezone' => $newtimezone}); |
|
&Apache::lonnet::appenv({'environment.timezone' => $newtimezone}); |
|
$message=&Apache::lonhtmlcommon::confirm_success( |
|
&mt('Set [_1] to [_2]', |
|
'<i>'.&mt('Your Time Zone').'</i>', |
|
'<tt>"'.$newtimezone.'"</tt>.')). |
|
'<br />'; |
|
} |
|
} elsif ($currtimezone) { |
|
&Apache::lonnet::del('environment',['timezone']); |
|
&Apache::lonnet::delenv('environment.timezone'); |
|
$message=&Apache::lonhtmlcommon::confirm_success(&mt('Time Zone now set by LON-CAPA')); |
|
} else { |
|
$message = &mt('Time Zone settings unchanged'); |
|
} |
|
$message=&Apache::loncommon::confirmwrapper($message); |
|
&print_main_menu($r,$message); |
|
return; |
|
} |
|
|
sub print_main_menu { |
sub print_main_menu { |
my ($r, $message) = @_; |
my ($r, $message) = @_; |
# Determine current authentication method |
# Determine current authentication method |
Line 2197 my %permissions;
|
Line 2346 my %permissions;
|
if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) { |
if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) { |
$permissions{'aboutme'} = 'F'; |
$permissions{'aboutme'} = 'F'; |
} |
} |
|
if (&Apache::lonnet::usertools_access($user,$domain,'timezone')) { |
|
$permissions{'timezone'} = 'F'; |
|
} |
my @menu= |
my @menu= |
({ categorytitle=>'Personal Data', |
({ categorytitle=>'Personal Data', |
items =>[ |
items =>[ |
Line 2239 my @menu=
|
Line 2391 my @menu=
|
icon => 'dismath.png', |
icon => 'dismath.png', |
linktitle => 'Change how math is displayed.' |
linktitle => 'Change how math is displayed.' |
}, |
}, |
|
{ |
|
linktext => 'Time Zone', |
|
url => '/adm/preferences?action=changetimezone', |
|
permission => $permissions{'timezone'}, |
|
#help => '', |
|
icon => 'timezone.png', |
|
linktitle => 'Set your time zone.', |
|
} |
] |
] |
}, |
}, |
{ categorytitle=>'Page Display Settings', |
{ categorytitle=>'Page Display Settings', |
Line 2300 push(@{ $menu[0]->{items} }, {
|
Line 2460 push(@{ $menu[0]->{items} }, {
|
linktitle => 'Change your password.', |
linktitle => 'Change your password.', |
}); |
}); |
} |
} |
if ($env{'environment.remote'} eq 'off') { |
|
push(@{ $menu[1]->{items} }, { |
|
linktext => 'Launch Remote Control', |
|
url => '/adm/remote?url=/adm/preferences&action=launch', |
|
permission => 'F', |
|
#help => '', |
|
icon => 'remotecontrol.png', |
|
linktitle => 'Launch the remote control for LON-CAPA.', |
|
}); |
|
}else{ |
|
push(@{ $menu[1]->{items} }, { |
|
linktext => 'Collapse Remote Control', |
|
url => '/adm/remote?url=/adm/preferences&action=collapse', |
|
permission => 'F', |
|
#help => '', |
|
icon => 'remotecontrol.png', |
|
linktitle => 'Collapse the remote control for LON-CAPA.', |
|
}); |
|
} |
|
|
|
if (&can_toggle_namelocking()) { |
if (&can_toggle_namelocking()) { |
push(@{ $menu[0]->{items} }, { |
push(@{ $menu[0]->{items} }, { |
Line 2431 sub handler {
|
Line 2572 sub handler {
|
text => $brtxt, |
text => $brtxt, |
help => $brhelp,}); |
help => $brhelp,}); |
if(!exists $env{'form.action'}) { |
if(!exists $env{'form.action'}) { |
&print_main_menu($r); |
&print_main_menu($r); |
$ended = 1; |
$ended = 1; |
}elsif($env{'form.action'} eq 'changepass'){ |
}elsif($env{'form.action'} eq 'changepass'){ |
&passwordchanger($r); |
&passwordchanger($r); |
}elsif($env{'form.action'} eq 'verify_and_change_pass'){ |
}elsif($env{'form.action'} eq 'verify_and_change_pass'){ |
Line 2516 sub handler {
|
Line 2657 sub handler {
|
} elsif ($env{'form.action'} eq 'verify_and_change_lockednames') { |
} elsif ($env{'form.action'} eq 'verify_and_change_lockednames') { |
&verify_and_change_lockednames($r); |
&verify_and_change_lockednames($r); |
$ended = 1; |
$ended = 1; |
|
} elsif ($env{'form.action'} eq 'changetimezone') { |
|
&timezonechanger($r); |
|
} elsif ($env{'form.action'} eq 'verify_and_change_timezone') { |
|
&verify_and_change_timezone($r); |
} |
} |
|
|
# Properly end the HTML page of all preference pages |
# Properly end the HTML page of all preference pages |