-MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.
+
-
-
+
$text
$construction
@@ -820,7 +747,11 @@ sub verify_and_change_domcoord {
}
my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Block access to Authoring Space').' ',''.$status.' '));
$message=&Apache::loncommon::confirmwrapper($message);
- &print_main_menu($r,$message);
+ if ($env{'form.returnurl'}) {
+ &do_redirect($r,$env{'form.returnurl'},$message);
+ } else {
+ &print_main_menu($r,$message);
+ }
}
#################################################################
@@ -834,7 +765,7 @@ sub lockwarning {
my $textbottom=&mt('Changing roles or logging out may result in data corruption.');
my ($num,%which)=&Apache::lonnet::get_locks();
my $which='';
- foreach my $id (keys %which) {
+ foreach my $id (keys(%which)) {
$which.=''.$which{$id}.' ';
}
my $change=&mt('Override');
@@ -876,15 +807,15 @@ sub msgforwardchanger {
foad => 'Forward to account(s)',
fwdm => 'Forward messages to other account(s) in LON-CAPA',
noti => 'E-mail notification of LON-CAPA messages',
- foad_exmpl => 'e.g. userA:domain1,userB:domain2,... ',
mnot => 'E-mail address(es) which should be notified about new LON-CAPA messages',
- mnot_exmpl => 'e.g. joe@doe.com ',
chg => 'Save',
email => 'The e-mail address entered in row ',
notv => 'is not a valid e-mail address',
toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one",
prme => 'Back',
);
+ $lt{'foad_exmpl'} = &mt('e.g. [_1]userA:domain1,userB:domain2,...[_2]','',' ');
+ $lt{'mnot_exmpl'} = &mt('e.g. [_1]joe@doe.com[_2]','',' ');
Apache::lonhtmlcommon::add_breadcrumb(
{ href => '/adm/preferences?action=changemsgforward',
text => 'Messages & Notifications'});
@@ -988,7 +919,7 @@ ENDMSG
'" onclick="javscript:delete_address('."'$num'".')" />'.
&mt('Delete').''.
'';
my %chk;
if (defined($allnot{$item}{'crit'})) {
@@ -1037,7 +968,7 @@ ENDMSG
' '.&mt('Add new address').' '.
'';
+ '" onfocus="javascript:new_address('."'$num'".')" /> ';
foreach my $type ('all','crit','reg') {
$output .= ''.
'
+ \n",$caller,$mailtoken,$timelimit,$extrafields);
+ if ($caller eq 'reset_by_email') {
+ return 'missingdata';
+ } else {
+ return;
+ }
}
# Get the keys
my $lonhost = $r->dir_config('lonHostID');
@@ -1601,13 +1670,17 @@ sub verify_and_change_password {
ENDERROR
# Probably should log an error here
- return 1;
+ if ($caller eq 'reset_by_email') {
+ return 'internalerror';
+ } else {
+ return;
+ }
}
my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
- #
- $currentpass = &des_decrypt($ckey ,$currentpass);
- $newpass1 = &des_decrypt($n1key,$newpass1);
- $newpass2 = &des_decrypt($n2key,$newpass2);
+ #
+ $currentpass = &Apache::loncommon::des_decrypt($ckey ,$currentpass);
+ $newpass1 = &Apache::loncommon::des_decrypt($n1key,$newpass1);
+ $newpass2 = &Apache::loncommon::des_decrypt($n2key,$newpass2);
#
if ($caller eq 'reset_by_email') {
my %data = &Apache::lonnet::tmpget($mailtoken);
@@ -1615,30 +1688,53 @@ ENDERROR
&passwordchanger($r,
''.
&mt('Could not verify current authentication.').' '.
- &mt('Please try again.').' ',$caller,$mailtoken);
- return 1;
+ &mt('Please try again.').'',$caller,$mailtoken,$timelimit,$extrafields);
+ return 'emptydata';
}
if ($currentpass ne $data{'temppasswd'}) {
&passwordchanger($r,
''.
&mt('Could not verify current authentication.').' '.
- &mt('Please try again.').' ',$caller,$mailtoken);
- return 1;
+ &mt('Please try again.').'',$caller,$mailtoken,$timelimit,$extrafields);
+ return 'missingtemp';
}
- }
+ }
if ($newpass1 ne $newpass2) {
&passwordchanger($r,
''.
&mt('The new passwords you entered do not match.').' '.
- &mt('Please try again.').' ',$caller,$mailtoken);
- return 1;
+ &mt('Please try again.').'',$caller,$mailtoken,$timelimit,$extrafields);
+ if ($caller eq 'reset_by_email') {
+ return 'mismatch';
+ } else {
+ return;
+ }
}
- if (length($newpass1) < 7) {
- &passwordchanger($r,
- ''.
- &mt('Passwords must be a minimum of 7 characters long.').' '.
- &mt('Please try again.').' ',$caller,$mailtoken);
- return 1;
+ if ($currentauth eq 'unix:') {
+ if (length($newpass1) < 7) {
+ &passwordchanger($r,
+ ''.
+ &mt('Passwords must be a minimum of 7 characters long.').' '.
+ &mt('Please try again.').' ',$caller,$mailtoken,$timelimit,$extrafields);
+ if ($caller eq 'reset_by_email') {
+ return 'length';
+ } else {
+ return;
+ }
+ }
+ } else {
+ my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1);
+ if ($warning) {
+ &passwordchanger($r,''.
+ $warning.
+ &mt('Please try again.').' ',
+ $caller,$mailtoken,$timelimit,$extrafields);
+ if ($caller eq 'reset_by_email') {
+ return 'rules';
+ } else {
+ return;
+ }
+ }
}
#
# Check for bad characters
@@ -1657,8 +1753,12 @@ ENDERROR
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
ENDERROR
- &passwordchanger($r,$errormessage,$caller,$mailtoken);
- return 1;
+ &passwordchanger($r,$errormessage,$caller,$mailtoken,$timelimit,$extrafields);
+ if ($caller eq 'reset_by_email') {
+ return 'badchars';
+ } else {
+ return;
+ }
}
#
# Change the password (finally)
@@ -1673,20 +1773,32 @@ ENDERROR
$r->print($message.' ');
} else {
&print_main_menu($r, $message);
+ if (ref($ended)) {
+ $$ended = 1;
+ }
}
} else {
# error error: run in circles, scream and shout
if ($caller eq 'reset_by_email') {
if (!$result) {
- return 1;
+ return 'error';
} else {
return $result;
}
} else {
+ my $feedback;
+ if ($result eq 'prioruse') {
+ $feedback = &mt('Please enter a password that you have not used recently.');
+ } else {
+ $feedback = &mt('Please make sure your old password was entered correctly.');
+ }
$message = &Apache::lonhtmlcommon::confirm_success(
- &mt("The password for user [_1] was not changed.",''.$user.' ').' '.&mt('Please make sure your old password was entered correctly.'),1);
+ &mt("The password for user [_1] was not changed.",''.$user.' ').' '.$feedback,1);
$message=&Apache::loncommon::confirmwrapper($message);
&print_main_menu($r, $message);
+ if (ref($ended)) {
+ $$ended = 1;
+ }
}
}
return;
@@ -1820,7 +1932,7 @@ sub verify_and_change_discussion {
if (defined($env{'form.discmark'}) ) {
my $newmark = $env{'form.newmark'};
if ($newmark eq 'ondisp') {
- $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will be cease to be identified as "NEW" after display.')).' ';
+ $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will cease to be identified as "NEW" after display.')).' ';
&Apache::lonnet::put('environment',{'discmarkread' => $newmark});
&Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
} else {
@@ -1922,15 +2034,282 @@ sub verify_and_change_coursepage {
&print_main_menu($r,$message);
}
-sub lockednameschanger {
+sub author_space_settings {
my $r = shift;
&Apache::lonhtmlcommon::add_breadcrumb(
- { href => '/adm/preferences?action=changelockednames',
- text => 'Automatic name changes'});
- $r->print(Apache::loncommon::start_page('Automatic name changes'));
- $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates'));
+ { href => '/adm/preferences?action=authorsettings',
+ text => 'Authoring Space Settings'});
+ my $user = $env{'user.name'};
+ my $domain = $env{'user.domain'};
+ my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
+ if (keys(%author_roles) > 0) {
+ my ($showdomdefs,$js,$args,@items);
+ my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
+ my $reqdmajor = 2;
+ my $reqdminor = 12;
+ my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'});
+ my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
+ unless (($major eq '' && $minor eq '') ||
+ ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor))) {
+ @items = ('nocodemirror','copyright','sourceavail');
+ $showdomdefs = 1;
+ $js = &toggle_options_js();
+ my $onload;
+ foreach my $item (@items) {
+ $onload .= "javascript:toggleOptions(document.prefs,'$item','user_$item');"
+ }
+ $args = { 'add_entries' => { 'onload' => $onload } };
+ }
+ $r->print(Apache::loncommon::start_page('Authoring Space Settings',$js,$args));
+ $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings'));
+ if ($showdomdefs) {
+ my %userenv = &Apache::lonnet::get('environment',\@items);
+ my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
+ my %staticdefaults = (
+ 'nocodemirror' => '0',
+ 'copyright' => 'default',
+ 'sourceavail' => 'closed',
+ );
+ my %lt = &authoring_settings_text();
+ my %titles = &authoring_settings_titles();
+ $r->print("$lt{'auss'} \n".
+ ''."\n".
+ ' '."\n".
+ ' '."\n");
+ foreach my $item (@items) {
+ my ($domdef,$checkeddom,$checkeduser,$domdefdisplay,$divsty,$userelem);
+ $checkeddom = ' checked="checked"';
+ $divsty = 'display:none';
+ if (exists($domdefs{$item})) {
+ $domdef = $domdefs{$item};
+ } else {
+ $domdef = $staticdefaults{$item};
+ }
+ if ($item eq 'copyright') {
+ $domdefdisplay = &Apache::loncommon::copyrightdescription($domdef);
+ $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'',
+ \&Apache::loncommon::copyrightdescription,
+ (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids)));
+ } elsif ($item eq 'sourceavail') {
+ $domdefdisplay = &Apache::loncommon::source_copyrightdescription($domdef);
+ $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'',
+ \&Apache::loncommon::source_copyrightdescription,
+ (&Apache::loncommon::source_copyrightids));
+ } elsif ($item eq 'nocodemirror') {
+ if ($domdef) {
+ $domdefdisplay = $lt{'yes'};
+ } else {
+ $domdefdisplay = $lt{'no'};
+ }
+ my %checked;
+ $checked{'no'} = ' checked="checked"';
+ if ($userenv{$item} eq 'yes') {
+ $checked{'yes'} = $checked{'no'};
+ $checked{'no'} = '';
+ }
+ $userelem = '';
+ foreach my $choice ('yes','no') {
+ $userelem .= ' '.$lt{$choice}.' ';
+ }
+ $userelem .= ' ';
+ }
+ if ($userenv{$item} ne '') {
+ $checkeduser = $checkeddom;
+ $checkeddom = '';
+ $divsty = 'display:inline-block';
+ }
+ $r->print(<<"END");
+$titles{$item}
+$lt{'curd'}: $domdefdisplay
+
+ $lt{'used'}
+ $lt{'usyo'}
+
+$lt{'ousv'}
+$userelem
+
+END
+ }
+ $r->print(' '.
+ ' '.
+ ' '."\n");
+ } else {
+ my $constchecked='';
+ if ($env{'environment.nocodemirror'}) {
+ $constchecked=' checked="checked"';
+ }
+ my $text=&mt('By default, CodeMirror an editor with advanced functionality for editing code is activated for authors.');
+ my $cmoff=&mt('Deactivate CodeMirror. This can improve performance on slow computers and accessibility.');
+ my $change=&mt('Save');
+ $r->print(<
+
+
+ $text
+ $cmoff
+
+
+ENDSCREEN
+ }
+ }
+}
+
+sub change_authoring_settings {
+ my $r = shift;
+ my $user = $env{'user.name'};
+ my $domain = $env{'user.domain'};
+ my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
+ if (keys(%author_roles) > 0) {
+ my $message;
+ if (0) {
+ my %ausettings=('environment.nocodemirror' => '');
+ if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }
+ &Apache::lonnet::put('environment',\%ausettings);
+ &Apache::lonnet::appenv({'environment.nocodemirror' => $ausettings{'environment.nocodemirror'}});
+ my $status='';
+ if ($ausettings{'environment.nocodemirror'} eq 'yes') {
+ $status=&mt('on');
+ } else {
+ $status=&mt('off');
+ }
+ $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').' ',''.$status.' '));
+ $message=&Apache::loncommon::confirmwrapper($message);
+ } else {
+ my @items = ('nocodemirror','copyright','sourceavail');
+ my %oldsettings = &Apache::lonnet::get('environment',\@items);
+ my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
+ my %lt = &authoring_settings_text();
+ my %titles = &authoring_settings_titles();
+ my ($result,%newsettings,%changes,@delete,@unchanged,@delerrors,@adderrors);
+ foreach my $item (@items) {
+ if ($env{'form.'.$item} eq 'dom') {
+ if ($oldsettings{$item} eq '') {
+ push(@unchanged,$item);
+ } else {
+ push(@delete,$item);
+ }
+ } elsif ($env{'form.'.$item} eq 'user') {
+ my $newval = $env{'form.userchoice_'.$item};
+ my @possibles;
+ if ($item eq 'nocodemirror') {
+ if ($newval =~ /^yes|no$/) {
+ $newsettings{$item} = $newval;
+ }
+ } elsif ($item eq 'copyright') {
+ @possibles = (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids));
+ if (grep(/^\Q$newval\E$/,@possibles)) {
+ $newsettings{$item} = $newval;
+ }
+ } elsif ($item eq 'sourceavail') {
+ @possibles = (&Apache::loncommon::source_copyrightids);
+ if (grep(/^\Q$newval\E$/,@possibles)) {
+ $newsettings{$item} = $newval;
+ }
+ }
+ if ($oldsettings{$item} eq $newsettings{$item}) {
+ push(@unchanged,$item);
+ } else {
+ $changes{$item} = $newsettings{$item};
+ }
+ }
+ }
+ if (@delete) {
+ if (&Apache::lonnet::del('environment',\@delete) eq 'ok') {
+ foreach my $key (@delete) {
+ &Apache::lonnet::delenv('environment.'.$key);
+ }
+ } else {
+ @delerrors = @delete;
+ }
+ }
+ if (keys(%changes)) {
+ if (&Apache::lonnet::put('environment',\%changes) eq 'ok') {
+ my %newenvhash;
+ map {$newenvhash{'environment.'.$_} = $changes{$_}; } (keys(%changes));
+ &Apache::lonnet::appenv(\%newenvhash);
+ } else {
+ foreach my $item (@items) {
+ if (exists($changes{$item})) {
+ push(@adderrors,$item);
+ }
+ }
+ }
+ }
+ if (@adderrors) {
+ $result = &mt('An error occurred when saving user-specific settings for').': '.
+ join(', ', map { $titles{$_} } @adderrors);
+ $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1));
+ } elsif (keys(%changes)) {
+ $result = &mt('User-specific settings saved:').'';
+ foreach my $item (@items) {
+ next unless (exists($changes{$item}));
+ my $value = $changes{$item};
+ if ($item eq 'nocodemirror') {
+ $value = $lt{$changes{$item}};
+ } elsif ($item eq 'copyright') {
+ $value = &Apache::loncommon::copyrightdescription($changes{$item});
+ } elsif ($item eq 'sourceavail') {
+ $value = &Apache::loncommon::source_copyrightdescription($changes{$item});
+ }
+ $result .= ''.
+ &mt('[_1] set to [_2]',
+ $titles{$item},
+ ''.$value.' ').
+ ' ';
+ }
+ $result .= ' ';
+ $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));
+ }
+ if (@delerrors) {
+ $result = &mt('An error occurred when deleting user-specific settings for').':'.
+ join(' ', map { $titles{$_} } @delerrors).' ';
+ $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1));
+ } elsif (@delete) {
+ $result = &mt('Set use of domain default for').':'.
+ join(' ', map { $titles{$_} } @delete).' ';
+ $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));
+ }
+ if (@unchanged) {
+ $result = &mt('No changes made for').':'.
+ join(' ', map { $titles{$_} } @unchanged).' ';
+ $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));
+ }
+ }
+ if ($env{'form.returnurl'}) {
+ &do_redirect($r,$env{'form.returnurl'},$message);
+ } else {
+ &print_main_menu($r,$message);
+ }
+ }
+}
+
+sub authoring_settings_text {
+ return &Apache::lonlocal::texthash(
+ 'auss' => 'Authoring Space Settings',
+ 'used' => 'Use domain default',
+ 'usyo' => 'Use your own user-specific setting',
+ 'curd' => 'Current domain default is',
+ 'ousv' => 'Own user-specific value',
+ 'save' => 'Save',
+ 'yes' => 'Deactivated',
+ 'no' => 'Activated',
+ );
+}
+
+sub authoring_settings_titles {
+ return &Apache::lonlocal::texthash(
+ 'nocodemirror' => 'CodeMirror for EditXML editor',
+ 'copyright' => 'Default Copyright/Distribution in new metadata file',
+ 'sourceavail' => 'Default Source Available in new metadata file',
+ );
+}
+
+sub lockednameschanger {
+ my $r = shift;
my %userenv = &Apache::lonnet::get('environment',['lockedname']);
my $lockedname='';
+ my $ended;
if (&can_toggle_namelocking()) {
if ($userenv{'lockedname'}) {
$lockedname = ' checked="checked"';
@@ -1948,6 +2327,11 @@ sub lockednameschanger {
}
}
if (keys(%updateable)) {
+ &Apache::lonhtmlcommon::add_breadcrumb(
+ { href => '/adm/preferences?action=changelockednames',
+ text => 'Automatic name changes'});
+ $r->print(Apache::loncommon::start_page('Automatic name changes'));
+ $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates'));
my %longnames = &Apache::lonlocal::texthash (
firstname => 'First Name',
middlename => 'Middle Name',
@@ -1974,11 +2358,14 @@ ENDSCREEN
} else {
my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');
&print_main_menu($r,$message);
+ $ended = 1;
}
} else {
my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.');
&print_main_menu($r,$message);
+ $ended = 1;
}
+ return $ended;
}
sub verify_and_change_lockednames {
@@ -2009,6 +2396,91 @@ sub verify_and_change_lockednames {
&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 = &toggle_options_js();
+ my $js = <<"ENDSCRIPT";
+ my %loaditems = (
+ onload => "javascript:toggleOptions(document.prefs,'settimezone','LC_timezone_selector');",
+ );
+ 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:toggleOptions(this.form,'."'settimezone','LC_timezone_selector'".');"';
+ my $selector = &Apache::loncommon::select_timezone('timezone',$timezone,undef,1);
+ $r->print(<<"END");
+
+
+
+
+$lt{'lctz'}
+
+$lt{'owntz'}
+$selector
+
+
+
+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]',
+ ''.&mt('Your Time Zone').' ',
+ '"'.$newtimezone.'" .')).
+ ' ';
+ }
+ } 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 {
my ($r, $message) = @_;
# Determine current authentication method
@@ -2023,6 +2495,11 @@ my %permissions;
if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) {
$permissions{'aboutme'} = 'F';
}
+if (&Apache::lonnet::usertools_access($user,$domain,'timezone')) {
+ $permissions{'timezone'} = 'F';
+}
+my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
+my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
my @menu=
({ categorytitle=>'Personal Data',
items =>[
@@ -2065,6 +2542,14 @@ my @menu=
icon => 'dismath.png',
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',
@@ -2103,6 +2588,33 @@ my @menu=
},
]
},
+ );
+if (keys(%author_coauthor_roles) > 0) {
+ push(@menu,
+ { categorytitle=>'Authoring Settings',
+ items => [
+ {
+ linktext => 'Authoring Space Configuration',
+ url => '/adm/preferences?action=authorsettings',
+ permission => 'F',
+ icon => 'codemirror.png',
+ linktitle => 'Settings for your authoring space.',
+ },
+ ]
+ },
+ );
+ if (keys(%author_roles) > 0) {
+ push(@{ $menu[4]->{items} }, {
+ linktext => 'Restrict Domain Coordinator Access',
+ url => '/adm/preferences?action=changedomcoord',
+ permission => 'F',
+ #help => '',
+ icon => 'system-lock-screen.png',
+ linktitle => 'Restrict domain coordinator access.',
+ });
+ }
+}
+push(@menu,
{ categorytitle=>'Other',
items =>[
{ linktext => 'Register Response Devices ("Clickers")',
@@ -2117,7 +2629,7 @@ my @menu=
);
if ($currentauth =~ /^(unix|internal):/) {
-push(@{ $menu[0]->{items} }, {
+ push(@{ $menu[0]->{items} }, {
linktext => 'Password',
url => '/adm/preferences?action=changepass',
permission => 'F',
@@ -2127,7 +2639,7 @@ push(@{ $menu[0]->{items} }, {
});
}
if ($env{'environment.remote'} eq 'off') {
-push(@{ $menu[1]->{items} }, {
+ push(@{ $menu[1]->{items} }, {
linktext => 'Launch Remote Control',
url => '/adm/remote?url=/adm/preferences&action=launch',
permission => 'F',
@@ -2157,22 +2669,10 @@ push(@{ $menu[1]->{items} }, {
});
}
- my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
- if (keys(%author_roles) > 0) {
-push(@{ $menu[4]->{items} }, {
- linktext => 'Restrict Domain Coordinator Access',
- url => '/adm/preferences?action=changedomcoord',
- permission => 'F',
- #help => '',
- icon => 'system-lock-screen.png',
- linktitle => 'Restrict domain coordinator access.',
- });
- }
-
if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
|| &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
.$env{'request.course.sec'})) {
-push(@{ $menu[4]->{items} }, {
+push(@{ $menu[-1]->{items} }, {
linktext => 'Course Initialization',
url => '/adm/preferences?action=changecourseinit',
permission => 'F',
@@ -2182,8 +2682,9 @@ push(@{ $menu[4]->{items} }, {
});
}
+
if (&can_toggle_debug()) {
-push(@{ $menu[4]->{items} }, {
+push(@{ $menu[-1]->{items} }, {
linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'),
url => '/adm/preferences?action=debugtoggle',
permission => 'F',
@@ -2219,10 +2720,22 @@ sub handler {
['action','wysiwyg','returnurl','refpage']);
#
Apache::lonhtmlcommon::clear_breadcrumbs();
- my ($brlink,$brtxt,$brhelp);
+ my ($brlink,$brtxt,$brhelp,$ended);
if (($env{'form.action'} eq 'changerolespref') && ($env{'form.returnurl'} eq '/adm/roles')) {
$brlink ='/adm/roles';
$brtxt = 'User Roles';
+ } elsif ((($env{'form.action'} eq 'changedomcoord') ||
+ ($env{'form.action'} eq 'authorsettings')) &&
+ (($env{'form.returnurl'} =~ m{^/(priv/|res($|/))}) ||
+ ($env{'form.returnurl'} eq '/adm/createuser'))) {
+ $brlink = $env{'form.returnurl'};
+ if ($env{'form.returnurl'} eq '/adm/createuser') {
+ $brtxt = 'User Management';
+ } elsif ($env{'form.returnurl'} =~ m{^/res($\/)}) {
+ $brtxt = 'Browse published resources';
+ } else {
+ $brtxt = 'Authoring Space';
+ }
} else {
$brlink ='/adm/preferences';
$brtxt = 'Set User Preferences';
@@ -2234,14 +2747,16 @@ sub handler {
help => $brhelp,});
if(!exists $env{'form.action'}) {
&print_main_menu($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changepass'){
&passwordchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_pass'){
- &verify_and_change_password($r);
+ &verify_and_change_password($r,'preferences','','','',\$ended);
}elsif($env{'form.action'} eq 'changescreenname'){
&screennamechanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_screenname'){
&verify_and_change_screenname($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changemsgforward'){
&msgforwardchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_msgforward'){
@@ -2250,38 +2765,47 @@ sub handler {
&colorschanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_colors'){
&verify_and_change_colors($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changelanguages'){
&languagechanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_languages'){
&verify_and_change_languages($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changewysiwyg'){
&wysiwygchanger($r);
}elsif($env{'form.action'} eq 'set_wysiwyg'){
&verify_and_change_wysiwyg($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changediscussions'){
&discussionchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_discussion'){
&verify_and_change_discussion($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changerolespref'){
&rolesprefchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_rolespref'){
&verify_and_change_rolespref($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changetexenginepref'){
&texenginechanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_texengine'){
&verify_and_change_texengine($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changeicons'){
&iconchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_icons'){
&verify_and_change_icons($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changeclicker'){
&clickerchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_clicker'){
&verify_and_change_clicker($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changedomcoord'){
&domcoordchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
&verify_and_change_domcoord($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'lockwarning'){
&lockwarning($r);
}elsif($env{'form.action'} eq 'verify_and_change_locks'){
@@ -2290,22 +2814,33 @@ sub handler {
&coursedisplaychanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_coursepage'){
&verify_and_change_coursepage($r);
+ $ended = 1;
+ }elsif($env{'form.action'} eq 'authorsettings'){
+ &author_space_settings($r);
+ }elsif($env{'form.action'} eq 'change_authoring_settings'){
+ &change_authoring_settings($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'debugtoggle'){
if (&can_toggle_debug()) {
&toggle_debug();
}
&print_main_menu($r);
+ $ended = 1;
} elsif ($env{'form.action'} eq 'changelockednames') {
- &lockednameschanger($r);
+ $ended = &lockednameschanger($r);
} elsif ($env{'form.action'} eq 'verify_and_change_lockednames') {
&verify_and_change_lockednames($r);
+ $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
# started in each sub routine
# Exception: print_main_menu has its own end_page call
- unless (!exists $env{'form.action'} ||
- $env{'form.action'} eq 'debugtoggle') {
+ unless ($ended) {
$r->print(&Apache::loncommon::end_page());
}
@@ -2378,5 +2913,69 @@ sub updateable_userinfo {
return %updateable;
}
+sub do_redirect {
+ my ($r,$url,$msg) = @_;
+ $r->print(
+ &Apache::loncommon::start_page('Loading ...',undef,
+ {'redirect' => [2,$url]}).
+ '
'."\n".
+ "$msg\n".
+ &Apache::loncommon::end_page());
+ return;
+}
+
+sub toggle_options_js {
+ return <<"ENDSCRIPT";
+
+ENDSCRIPT
+}
+
+sub selectbox {
+ my ($name,$value,$readonly,$functionref,@idlist)=@_;
+ my $selout = '';
+ foreach my $id (@idlist) {
+ $selout.=''.&{$functionref}($id).' ';
+ }
+ $selout.=' ';
+ return $selout;
+}
+
1;
__END__