Diff for /loncom/interface/lonpreferences.pm between versions 1.196.4.28.2.4 and 1.239

version 1.196.4.28.2.4, 2024/03/01 21:28:39 version 1.239, 2021/11/30 15:55:37
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 39  use Apache::lonlocal; Line 40  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 2043  sub author_space_settings { Line 2078  sub author_space_settings {
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);      my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
     if (keys(%author_roles) > 0) {      if (keys(%author_roles) > 0) {
         my ($showdomdefs,$js,$args,@items);              $r->print(Apache::loncommon::start_page('Authoring Space Settings'));
         my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');              $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings'));
         my $reqdmajor = 2;              my %userenv = &Apache::lonnet::get('environment',['nocodemirror']);
         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))) {  
             @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("<h3>$lt{'auss'}</h3><br /><hr />\n".  
                       '<form name="prefs" action="/adm/preferences" method="post">'."\n".  
                       '<input type="hidden" name="returnurl" value="'.$returnurl.'" />'."\n".  
                       '<input type="hidden" name="action" value="change_authoring_settings" />'."\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 = '<span class="LC_nobreak">';  
                     foreach my $choice ('yes','no') {  
                         $userelem .= '<label><input type="radio" name="userchoice_'.$item.'" value="'.$choice.'"'.  
                                      $checked{$choice}.' />'.$lt{$choice}.'</label>&nbsp;&nbsp;&nbsp;';  
                     }  
                     $userelem .= '</span>';  
                 }  
                 if ($userenv{$item} ne '') {  
                     $checkeduser = $checkeddom;  
                     $checkeddom = '';  
                     $divsty = 'display:inline-block';  
                 }  
                 $r->print(<<"END");  
 <h4><span class="LC_nobreak">$titles{$item}</span></h4>  
 <p class="LC_nobreak">$lt{'curd'}: <span style="font-style:italic">$domdefdisplay</span></p>  
 <p class="LC_nobreak">  
 <label><input type="radio" name="$item" value="dom" onclick="toggleOptions(this.form,'$item','user_$item');"$checkeddom />$lt{'used'}</label>&nbsp;&nbsp;&nbsp;  
 <label><input type="radio" name="$item" value="user" onclick="toggleOptions(this.form,'$item','user_$item');"$checkeduser />$lt{'usyo'}</label></p>  
 <fieldset id="user_$item" style="$divsty">  
 <legend style="font-weight:normal;font-style:italic;">$lt{'ousv'}</legend>  
 $userelem  
 </fieldset><br /><hr />  
 END  
             }  
             $r->print('<br />'.  
                       '<input type="submit" value="'.$lt{'save'}.'" />'.  
                       '</form>'."\n");  
         } else {  
             my $constchecked='';              my $constchecked='';
             if ($env{'environment.nocodemirror'}) {              if ($env{'environment.nocodemirror'}) {
                $constchecked=' checked="checked"';                 $constchecked=' checked="checked"';
Line 2156  END Line 2088  END
             my $text=&mt('By default, CodeMirror an editor with advanced functionality for editing code is activated for authors.');              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 $cmoff=&mt('Deactivate CodeMirror. This can improve performance on slow computers and accessibility.');
             my $change=&mt('Save');              my $change=&mt('Save');
               my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
             $r->print(<<ENDSCREEN);              $r->print(<<ENDSCREEN);
         <form name="prefs" action="/adm/preferences" method="post">          <form name="prefs" action="/adm/preferences" method="post">
         <input type="hidden" name="returnurl" value="$returnurl" />          <input type="hidden" name="returnurl" value="$returnurl" />
Line 2165  END Line 2098  END
         <input type="submit" value="$change" />          <input type="submit" value="$change" />
         </form>          </form>
 ENDSCREEN  ENDSCREEN
         }  
     }      }
 }  }
   
Line 2175  sub change_authoring_settings { Line 2107  sub change_authoring_settings {
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);      my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
     if (keys(%author_roles) > 0) {      if (keys(%author_roles) > 0) {
         my $message;  
         if (0) {  
             my %ausettings=('environment.nocodemirror' => '');              my %ausettings=('environment.nocodemirror' => '');
             if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }              if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }
             &Apache::lonnet::put('environment',\%ausettings);              &Apache::lonnet::put('environment',\%ausettings);
Line 2187  sub change_authoring_settings { Line 2117  sub change_authoring_settings {
             } else {              } else {
                 $status=&mt('off');                  $status=&mt('off');
             }              }
             $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));              my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));
             $message=&Apache::loncommon::confirmwrapper($message);              $message=&Apache::loncommon::confirmwrapper($message);
         } else {              if ($env{'form.returnurl'}) {
             my @items = ('nocodemirror','copyright','sourceavail');                  &do_redirect($r,$env{'form.returnurl'},$message);
             my %oldsettings = &Apache::lonnet::get('environment',\@items);              } else {
             my %domdefs = &Apache::lonnet::get_domain_defaults($domain);                  &print_main_menu($r,$message);
             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:').'<ul>';  
                 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 .= '<li>'.  
                                &mt('[_1] set to [_2]',  
                                    $titles{$item},  
                                    '<span style="font-style:italic">'.$value.'</span>').  
                                '</li>';  
                 }  
                 $result .= '</ul>';  
                 $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));  
             }  
             if (@delerrors) {  
                 $result = &mt('An error occurred when deleting user-specific settings for').':<ul><li>'.  
                           join('</li><li>', map { $titles{$_} } @delerrors).'</li></ul>';  
                 $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1));  
             } elsif (@delete) {  
                 $result = &mt('Set use of domain default for').':<ul><li>'.  
                           join('</li><li>', map { $titles{$_} } @delete).'</li></ul>';  
                 $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));  
             }  
             if (@unchanged) {  
                 $result = &mt('No changes made for').':<ul><li>'.  
                           join('</li><li>', map { $titles{$_} } @unchanged).'</li></ul>';  
                 $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 {  sub lockednameschanger {
     my $r = shift;      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'));
     my %userenv = &Apache::lonnet::get('environment',['lockedname']);      my %userenv = &Apache::lonnet::get('environment',['lockedname']);
     my $lockedname='';      my $lockedname='';
     my $ended;  
     if (&can_toggle_namelocking()) {      if (&can_toggle_namelocking()) {
         if ($userenv{'lockedname'}) {          if ($userenv{'lockedname'}) {
             $lockedname = ' checked="checked"';              $lockedname = ' checked="checked"';
Line 2341  sub lockednameschanger { Line 2153  sub lockednameschanger {
             }              }
         }          }
         if (keys(%updateable)) {          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 (              my %longnames = &Apache::lonlocal::texthash (
                                 firstname  => 'First Name',                                  firstname  => 'First Name',
                                 middlename => 'Middle Name',                                  middlename => 'Middle Name',
Line 2372  ENDSCREEN Line 2179  ENDSCREEN
         } else {          } else {
             my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');              my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');
             &print_main_menu($r,$message);              &print_main_menu($r,$message);
             $ended = 1;  
         }          }
     } else {      } else {
         my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.');          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);          &print_main_menu($r,$message);
         $ended = 1;  
     }      }
     return $ended;  
 }  }
   
 sub verify_and_change_lockednames {  sub verify_and_change_lockednames {
Line 2410  sub verify_and_change_lockednames { Line 2214  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 = &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");  
 <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>&nbsp;&nbsp;&nbsp;&nbsp;  
 <label><input type="radio" name="settimezone" value="1"$checked{'owntz'}$onclick />  
 $lt{'owntz'}</label><div style="display:$tzsty" id="LC_timezone_selector">&nbsp;  
 $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 2508  my %permissions; Line 2228  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 %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=  my @menu=
     ({ categorytitle=>'Personal Data',      ({ categorytitle=>'Personal Data',
  items =>[   items =>[
Line 2555  my @menu= Line 2270  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 2601  my @menu= Line 2308  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',      { categorytitle=>'Other',
  items =>[   items =>[
     { linktext => 'Register Response Devices (&quot;Clickers&quot;)',      { linktext => 'Register Response Devices (&quot;Clickers&quot;)',
Line 2642  push(@menu, Line 2322  push(@menu,
     );      );
   
     if ($currentauth =~ /^(unix|internal):/) {      if ($currentauth =~ /^(unix|internal):/) {
         push(@{ $menu[0]->{items} }, {  push(@{ $menu[0]->{items} }, {
  linktext => 'Password',   linktext => 'Password',
  url => '/adm/preferences?action=changepass',   url => '/adm/preferences?action=changepass',
  permission => 'F',   permission => 'F',
Line 2651  push(@menu, Line 2331  push(@menu,
  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&amp;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&amp;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 2682  push(@{ $menu[1]->{items} }, { Line 2343  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'})      if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
  || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'   || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
     .$env{'request.course.sec'})) {      .$env{'request.course.sec'})) {
 push(@{ $menu[-1]->{items} }, {  push(@{ $menu[4]->{items} }, {
  linktext => 'Course Initialization',   linktext => 'Course Initialization',
  url => '/adm/preferences?action=changecourseinit',   url => '/adm/preferences?action=changecourseinit',
  permission => 'F',   permission => 'F',
Line 2696  push(@{ $menu[-1]->{items} }, { Line 2369  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()) {      if (&can_toggle_debug()) {
 push(@{ $menu[-1]->{items} }, {  push(@{ $menu[4]->{items} }, {
  linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'),   linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'),
  url => '/adm/preferences?action=debugtoggle',   url => '/adm/preferences?action=debugtoggle',
  permission => 'F',   permission => 'F',
Line 2759  sub handler { Line 2443  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 2840  sub handler { Line 2524  sub handler {
  &print_main_menu($r);   &print_main_menu($r);
         $ended = 1;          $ended = 1;
     } elsif ($env{'form.action'} eq 'changelockednames') {      } elsif ($env{'form.action'} eq 'changelockednames') {
         $ended = &lockednameschanger($r);          &lockednameschanger($r);
     } 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
Line 2929  sub updateable_userinfo { Line 2609  sub updateable_userinfo {
 sub do_redirect {  sub do_redirect {
     my ($r,$url,$msg) = @_;      my ($r,$url,$msg) = @_;
     $r->print(      $r->print(
         &Apache::loncommon::start_page('Loading ...',undef,          &Apache::loncommon::start_page('Switching Server ...',undef,
                                        {'redirect'       => [2,$url]}).                                         {'redirect'       => [0.5,$url]}).
         '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".          '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
         "$msg\n".          "$msg\n".
         &Apache::loncommon::end_page());          &Apache::loncommon::end_page());
     return;      return;
 }  }
   
 sub toggle_options_js {  
     return <<"ENDSCRIPT";  
 <script type="text/javascript">  
 // <![CDATA[  
 function toggleOptions(form,radioname,divid) {  
     var num = form.elements[radioname].length;  
     if (num) {  
         var setvis = '';  
         var onvalue = 'user';  
         if (radioname == 'settimezone') {  
             onvalue = '1';  
         }  
         for (var i=0; i<num; i++) {  
             if (form.elements[radioname][i].checked) {  
                 if (form.elements[radioname][i].value == onvalue) {  
                     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  
 }  
   
 sub selectbox {  
     my ($name,$value,$readonly,$functionref,@idlist)=@_;  
     my $selout = '<select name="'.$name.'">';  
     foreach my $id (@idlist) {  
         $selout.='<option value="'.$id.'"';  
         if ($id eq $value) {  
             $selout.=' selected="selected"';  
         }  
         if ($readonly) {  
             $selout .= ' disabled="disabled"';  
         }  
         $selout.='>'.&{$functionref}($id).'</option>';  
     }  
     $selout.='</select>';  
     return $selout;  
 }  
   
 1;  1;
 __END__  __END__

Removed from v.1.196.4.28.2.4  
changed lines
  Added in v.1.239


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>