--- loncom/interface/lonpreferences.pm 2024/03/03 01:57:35 1.196.4.28.2.6 +++ loncom/interface/lonpreferences.pm 2024/07/04 23:13:07 1.196.4.29 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.196.4.28.2.6 2024/03/03 01:57:35 raeburn Exp $ +# $Id: lonpreferences.pm,v 1.196.4.29 2024/07/04 23:13:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,6 +31,7 @@ package Apache::lonpreferences; use strict; +use LONCAPA; use Apache::Constants qw(:common); use Apache::File; use Apache::loncommon(); @@ -39,7 +40,6 @@ use Apache::lonlocal; use Apache::lonnet; use LONCAPA::lonauthcgi(); use LONCAPA(); -use DateTime::TimeZone(); ################################################################ # Handler subroutines # @@ -2043,117 +2043,9 @@ sub author_space_settings { 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'},'"<>&\''); - if (&expanded_authoring_settings()) { - @items = ('nocodemirror'); - if (&daxe_permitted(\%author_roles)) { - push(@items,'daxecollapse'); - } - push(@items,('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', - 'daxecollapse' => '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') || ($item eq 'daxecollapse')) { - if ($domdef) { - if ($item eq 'daxecollapse') { - $domdefdisplay = $lt{'coll'}; - } else { - $domdefdisplay = $lt{'yes'}; - } - } else { - if ($item eq 'daxecollapse') { - $domdefdisplay = $lt{'expa'}; - } else { - $domdefdisplay = $lt{'no'}; - } - } - my (%checked,%text); - $checked{'no'} = ' checked="checked"'; - if ($userenv{$item} eq 'yes') { - $checked{'yes'} = $checked{'no'}; - $checked{'no'} = ''; - } - if ($item eq 'daxecollapse') { - %text = ( - yes => $lt{'coll'}, - no => $lt{'expa'}, - ); - } else { - %text = ( - yes => $lt{'yes'}, - no => $lt{'no'}, - ); - } - $userelem = ''; - foreach my $choice ('yes','no') { - $userelem .= '   '; - } - $userelem .= ''; - } - if ($userenv{$item} ne '') { - $checkeduser = $checkeddom; - $checkeddom = ''; - $divsty = 'display:inline-block'; - } - $r->print(<<"END"); -

$titles{$item}

-

$lt{'curd'}: $domdefdisplay

-

-    -

-
-$lt{'ousv'} -$userelem -


-END - } - $r->print(''. - '
'."\n"); - } else { + $r->print(Apache::loncommon::start_page('Authoring Space Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings')); + my %userenv = &Apache::lonnet::get('environment',['nocodemirror']); my $constchecked=''; if ($env{'environment.nocodemirror'}) { $constchecked=' checked="checked"'; @@ -2161,6 +2053,7 @@ END 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'); + my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\''); $r->print(< @@ -2170,7 +2063,6 @@ END ENDSCREEN - } } } @@ -2180,8 +2072,6 @@ sub change_authoring_settings { 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 (!&expanded_authoring_settings()) { my %ausettings=('environment.nocodemirror' => ''); if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; } &Apache::lonnet::put('environment',\%ausettings); @@ -2192,202 +2082,14 @@ sub change_authoring_settings { } else { $status=&mt('off'); } - $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.'')); + my $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'); - if (&daxe_permitted(\%author_roles)) { - push(@items,'daxecollapse'); - } - push(@items,('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') || ($item eq 'daxecollapse')) { - 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:').''; - $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); - } - if (@delerrors) { - $result = &mt('An error occurred when deleting user-specific settings for').':'; - $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1)); - } elsif (@delete) { - $result = &mt('Set use of domain default for').':'; - $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); - } - if (@unchanged) { - $result = &mt('No changes made for').':'; - $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', - 'expa' => 'Start Expanded', - 'coll' => 'Start Collapsed', - ); -} - -sub authoring_settings_titles { - return &Apache::lonlocal::texthash( - 'nocodemirror' => 'CodeMirror for EditXML editor', - 'daxecollapse' => 'Daxe editor: collapsible standard LON-CAPA menus', - 'copyright' => 'Default Copyright/Distribution in new metadata file', - 'sourceavail' => 'Default Source Available in new metadata file', - ); -} - -sub daxe_permitted { - my ($aurolesref) = @_; - my $hasdaxe; - if (ref($aurolesref) eq 'HASH') { - my %editors; - foreach my $key (keys(%{$aurolesref})) { - if ($key =~ /^:$LONCAPA::match_domain:au$/) { - if (exists($env{'environment.editors'})) { - if (grep(/^daxe$/,split(/,/,$env{'environment.editors'}))) { - $hasdaxe = 1; - last; - } - } + if ($env{'form.returnurl'}) { + &do_redirect($r,$env{'form.returnurl'},$message); } else { - my ($auname,$audom) = ($key =~ /^($LONCAPA::match_username):($LONCAPA::match_domain):(ca|aa)$/); - if (exists($env{"environment.internal.editors./$audom/$auname"})) { - if (grep(/^daxe$/,split(/,/,$env{"environment.internal.editors./$audom/$auname"}))) { - $hasdaxe = 1; - last; - } - } + &print_main_menu($r,$message); } - } } - return $hasdaxe; -} - -sub expanded_authoring_settings { - my $reqdmajor = 2; - my $reqdminor = 11; - my $reqddotnum = 4; - my $reqddotlett= 'B'; - my $reqdreldate = '2024030109'; - my $reqletterfail; - my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'}); - my ($major,$minor,$dotrel,$reldate) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.([\w.]+)\-(\d+)\'?$/); - my ($dotnum,$dotlett) = split(/\./,$dotrel); - my %lettdig = &Apache::lonnet::letter_to_digits(); - if ((exists($lettdig{$dotlett})) && (exists($lettdig{$reqddotlett}))) { - if ($lettdig{$reqddotlett} > $lettdig{$dotlett}) { - $reqletterfail = 1; - } - } - unless (($major eq '' && $minor eq '') || - ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)) || - (($reqdmajor == $major) && ($reqdminor == $minor) && ($reqddotnum > $dotnum)) || - (($reqdmajor == $major) && ($reqdminor == $minor) && ($reqddotnum == $dotnum) && $reqletterfail) || - (($reqdmajor == $major) && ($reqdminor == $minor) && ($reqddotnum == $dotnum) && ($reqdreldate > $reldate))) { - return 1; - } - return; } sub lockednameschanger { @@ -2481,90 +2183,6 @@ 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 %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"); -
- - -     -
  -$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 @@ -2579,11 +2197,6 @@ 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 =>[ @@ -2626,14 +2239,6 @@ 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', @@ -2672,33 +2277,6 @@ 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")', @@ -2713,7 +2291,7 @@ push(@menu, ); if ($currentauth =~ /^(unix|internal):/) { - push(@{ $menu[0]->{items} }, { +push(@{ $menu[0]->{items} }, { linktext => 'Password', url => '/adm/preferences?action=changepass', permission => 'F', @@ -2723,7 +2301,7 @@ push(@menu, }); } 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', @@ -2753,10 +2331,22 @@ 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[-1]->{items} }, { +push(@{ $menu[4]->{items} }, { linktext => 'Course Initialization', url => '/adm/preferences?action=changecourseinit', permission => 'F', @@ -2767,8 +2357,19 @@ push(@{ $menu[-1]->{items} }, { } + my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']); + if (keys(%author_coauthor_roles) > 0) { + push(@{ $menu[4]->{items} }, { + linktext => 'Authoring Space Configuration', + url => '/adm/preferences?action=authorsettings', + permission => 'F', + icon => 'codemirror.png', + linktitle => 'Settings for your authoring space.', + }); + } + if (&can_toggle_debug()) { -push(@{ $menu[-1]->{items} }, { +push(@{ $menu[4]->{items} }, { linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'), url => '/adm/preferences?action=debugtoggle', permission => 'F', @@ -2915,10 +2516,6 @@ sub handler { } 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 @@ -3000,66 +2597,13 @@ sub updateable_userinfo { sub do_redirect { my ($r,$url,$msg) = @_; $r->print( - &Apache::loncommon::start_page('Loading ...',undef, - {'redirect' => [2,$url]}). + &Apache::loncommon::start_page('Switching Server ...',undef, + {'redirect' => [0.5,$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 = ''; - return $selout; -} - 1; __END__