Diff for /loncom/interface/lonpreferences.pm between versions 1.196.4.28.2.5 and 1.245

version 1.196.4.28.2.5, 2024/03/02 16:09:04 version 1.245, 2024/03/03 00:08:37
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 2046  sub author_space_settings { Line 2081  sub author_space_settings {
         my ($showdomdefs,$js,$args,@items);          my ($showdomdefs,$js,$args,@items);
         my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');          my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
         if (&expanded_authoring_settings()) {          if (&expanded_authoring_settings()) {
             @items = ('nocodemirror','copyright','sourceavail');              @items = ('nocodemirror');
               if (&daxe_permitted(\%author_roles)) {
                   push(@items,'daxecollapse');
               }
               push(@items,('copyright','sourceavail'));
             $showdomdefs = 1;              $showdomdefs = 1;
             $js = &toggle_options_js();              $js = &toggle_options_js();
             my $onload;              my $onload;
Line 2062  sub author_space_settings { Line 2101  sub author_space_settings {
             my %domdefs = &Apache::lonnet::get_domain_defaults($domain);              my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
             my %staticdefaults = (              my %staticdefaults = (
                             'nocodemirror'  => '0',                              'nocodemirror'  => '0',
                               'daxecollapse'  => '0',
                             'copyright'     => 'default',                              'copyright'     => 'default',
                             'sourceavail'   => 'closed',                              'sourceavail'   => 'closed',
             );              );
             my %lt = &authoring_settings_text();              my %lt = &authoring_settings_text();
             my %titles = &authoring_settings_titles();              my %titles = &authoring_settings_titles();
             $r->print("<h3>$lt{'auss'}</h3><br /><hr />\n".              $r->print("<h3>$lt{'auss'}</h3>".
                       '<form name="prefs" action="/adm/preferences" method="post">'."\n".                        '<form name="prefs" action="/adm/preferences" method="post">'."\n".
                         '<input type="submit" value="'.$lt{'save'}.'" /><br /><hr />'."\n".
                       '<input type="hidden" name="returnurl" value="'.$returnurl.'" />'."\n".                        '<input type="hidden" name="returnurl" value="'.$returnurl.'" />'."\n".
                       '<input type="hidden" name="action" value="change_authoring_settings" />'."\n");                        '<input type="hidden" name="action" value="change_authoring_settings" />'."\n");
             foreach my $item (@items) {              foreach my $item (@items) {
Line 2090  sub author_space_settings { Line 2131  sub author_space_settings {
                     $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'',                      $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'',
                                            \&Apache::loncommon::source_copyrightdescription,                                             \&Apache::loncommon::source_copyrightdescription,
                                            (&Apache::loncommon::source_copyrightids));                                             (&Apache::loncommon::source_copyrightids));
                 } elsif ($item eq 'nocodemirror') {                  } elsif (($item eq 'nocodemirror') || ($item eq 'daxecollapse')) {
                     if ($domdef) {                      if ($domdef) {
                         $domdefdisplay = $lt{'yes'};                          if ($item eq 'daxecollapse') {
                               $domdefdisplay = $lt{'coll'};
                           } else {
                               $domdefdisplay = $lt{'yes'};
                           }
                     } else {                      } else {
                         $domdefdisplay = $lt{'no'};                          if ($item eq 'daxecollapse') {
                               $domdefdisplay = $lt{'expa'};
                           } else {
                               $domdefdisplay = $lt{'no'};
                           }
                     }                      }
                     my %checked;                      my (%checked,%text);
                     $checked{'no'} = ' checked="checked"';                      $checked{'no'} = ' checked="checked"';
                     if ($userenv{$item} eq 'yes') {                      if ($userenv{$item} eq 'yes') {
                         $checked{'yes'} = $checked{'no'};                          $checked{'yes'} = $checked{'no'};
                         $checked{'no'} = '';                          $checked{'no'} = '';
                     }                      }
                       if ($item eq 'daxecollapse') {
                           %text = (
                                    yes => $lt{'coll'},
                                    no  => $lt{'expa'},
                                  );
                       } else {
                           %text = (
                                    yes => $lt{'yes'},
                                    no  => $lt{'no'},
                                  );
                       }
                     $userelem = '<span class="LC_nobreak">';                      $userelem = '<span class="LC_nobreak">';
                     foreach my $choice ('yes','no') {                      foreach my $choice ('yes','no') {
                         $userelem .= '<label><input type="radio" name="userchoice_'.$item.'" value="'.$choice.'"'.                          $userelem .= '<label><input type="radio" name="userchoice_'.$item.'" value="'.$choice.'"'.
                                      $checked{$choice}.' />'.$lt{$choice}.'</label>&nbsp;&nbsp;&nbsp;';                                       $checked{$choice}.' />'.$text{$choice}.'</label>&nbsp;&nbsp;&nbsp;';
                     }                      }
                     $userelem .= '</span>';                      $userelem .= '</span>';
                 }                  }
Line 2126  $userelem Line 2186  $userelem
 </fieldset><br /><hr />  </fieldset><br /><hr />
 END  END
             }              }
             $r->print('<br />'.              $r->print('<input type="submit" value="'.$lt{'save'}.'" />'.
                       '<input type="submit" value="'.$lt{'save'}.'" />'.  
                       '</form>'."\n");                        '</form>'."\n");
         } else {          } else {
             my $constchecked='';              my $constchecked='';
Line 2171  sub change_authoring_settings { Line 2230  sub change_authoring_settings {
             $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));              $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 {          } else {
             my @items = ('nocodemirror','copyright','sourceavail');              my @items = ('nocodemirror');
               if (&daxe_permitted(\%author_roles)) {
                   push(@items,'daxecollapse');
               }
               push(@items,('copyright','sourceavail'));
             my %oldsettings = &Apache::lonnet::get('environment',\@items);              my %oldsettings = &Apache::lonnet::get('environment',\@items);
             my %domdefs = &Apache::lonnet::get_domain_defaults($domain);              my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
             my %lt = &authoring_settings_text();              my %lt = &authoring_settings_text();
Line 2187  sub change_authoring_settings { Line 2250  sub change_authoring_settings {
                 } elsif ($env{'form.'.$item} eq 'user') {                  } elsif ($env{'form.'.$item} eq 'user') {
                     my $newval = $env{'form.userchoice_'.$item};                      my $newval = $env{'form.userchoice_'.$item};
                     my @possibles;                      my @possibles;
                     if ($item eq 'nocodemirror') {                      if (($item eq 'nocodemirror') || ($item eq 'daxecollapse')) {
                         if ($newval =~ /^yes|no$/) {                          if ($newval =~ /^yes|no$/) {
                             $newsettings{$item} = $newval;                              $newsettings{$item} = $newval;
                         }                          }
Line 2242  sub change_authoring_settings { Line 2305  sub change_authoring_settings {
                     my $value = $changes{$item};                      my $value = $changes{$item};
                     if ($item eq 'nocodemirror') {                      if ($item eq 'nocodemirror') {
                         $value = $lt{$changes{$item}};                          $value = $lt{$changes{$item}};
                       } elsif ($item eq 'daxecollapse') {
                           if ($value eq 'yes') {
                               $value = $lt{'coll'};
                           } else {
                               $value = $lt{'expa'};
                           }
                     } elsif ($item eq 'copyright') {                      } elsif ($item eq 'copyright') {
                         $value = &Apache::loncommon::copyrightdescription($changes{$item});                          $value = &Apache::loncommon::copyrightdescription($changes{$item});
                     } elsif ($item eq 'sourceavail') {                      } elsif ($item eq 'sourceavail') {
Line 2289  sub authoring_settings_text { Line 2358  sub authoring_settings_text {
                'save' => 'Save',                 'save' => 'Save',
                'yes'  => 'Deactivated',                 'yes'  => 'Deactivated',
                'no'   => 'Activated',                 'no'   => 'Activated',
                  'expa' => 'Start Expanded',
                  'coll' => 'Start Collapsed',
      );       );
 }  }
   
 sub authoring_settings_titles {  sub authoring_settings_titles {
     return &Apache::lonlocal::texthash(      return &Apache::lonlocal::texthash(
                'nocodemirror' => 'CodeMirror for EditXML editor',                 'nocodemirror' => 'CodeMirror for EditXML editor',
                  'daxecollapse' => 'Daxe editor: collapsible standard LON-CAPA menus',
                'copyright'    => 'Default Copyright/Distribution in new metadata file',                 'copyright'    => 'Default Copyright/Distribution in new metadata file',
                'sourceavail'  => 'Default Source Available in new metadata file',                 'sourceavail'  => 'Default Source Available in new metadata file',
     );      );
Line 2302  sub authoring_settings_titles { Line 2374  sub authoring_settings_titles {
   
 sub expanded_authoring_settings {  sub expanded_authoring_settings {
     my $reqdmajor = 2;      my $reqdmajor = 2;
     my $reqdminor = 11;      my $reqdminor = 12;
     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 $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'});
     my ($major,$minor,$dotrel,$reldate) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.([\w.]+)\-(\d+)\'?$/);      my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
     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 '') ||      unless (($major eq '' && $minor eq '') ||
         ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)) ||              ($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 1;
     }      }
     return;      return;
 }  }
   
   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;
                       }
                   }
               } 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;
                       }
                   }
               }
           }
       }
       return $hasdaxe;
   }
   
 sub lockednameschanger {  sub lockednameschanger {
     my $r = shift;      my $r = shift;
     my %userenv = &Apache::lonnet::get('environment',['lockedname']);      my %userenv = &Apache::lonnet::get('environment',['lockedname']);
Line 2646  push(@menu, Line 2731  push(@menu,
     },      },
  ]   ]
     },      },
     );  );
   
     if ($currentauth =~ /^(unix|internal):/) {      if ($currentauth =~ /^(unix|internal):/) {
         push(@{ $menu[0]->{items} }, {          push(@{ $menu[0]->{items} }, {
Line 2658  push(@menu, Line 2743  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 2766  sub handler { Line 2832  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'){

Removed from v.1.196.4.28.2.5  
changed lines
  Added in v.1.245


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