Diff for /loncom/interface/lonparmset.pm between versions 1.522.2.26.2.3 and 1.522.2.31

version 1.522.2.26.2.3, 2021/01/19 00:44:10 version 1.522.2.31, 2024/07/03 04:06:27
Line 321  use Apache::lonnavmaps; Line 321  use Apache::lonnavmaps;
 use Apache::longroup;  use Apache::longroup;
 use Apache::lonrss;  use Apache::lonrss;
 use HTML::Entities;  use HTML::Entities;
   use Text::Wrap();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   
Line 767  sub valout { Line 768  sub valout {
         }          }
     } else {      } else {
         if ($type eq 'date_interval') {          if ($type eq 'date_interval') {
             my ($totalsecs,$donesuffix) = split(/_/,$value,2);              my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
             my ($usesdone,$donebuttontext,$proctor,$secretkey);  
             if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) {  
                 $donebuttontext = $1;  
                 (undef,$proctor,$secretkey) = split(/_/,$2);  
                 $usesdone = 'done';  
             } elsif ($donesuffix =~ /^done(|_.+)$/) {  
                 $donebuttontext = &mt('Done');  
                 ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix);  
             }  
             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);  
             my @timer;              my @timer;
             $year=$year-70;              $year=$year-70;
             $mday--;              $mday--;
Line 810  sub valout { Line 801  sub valout {
                 push(@timer,&mt('[quant,_1,sec]',0));                  push(@timer,&mt('[quant,_1,sec]',0));
             }              }
             $result.=join(", ",@timer);              $result.=join(", ",@timer);
             if ($usesdone eq 'done') {  
                 if ($secretkey) {  
                     $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey);  
                 } else {  
                     $result .= ' + "'.$donebuttontext.'"';  
                 }  
             }  
         } elsif (&isdateparm($type)) {          } elsif (&isdateparm($type)) {
             $result = &Apache::lonlocal::locallocaltime($value).              $result = &Apache::lonlocal::locallocaltime($value).
         &date_sanity_info($value);          &date_sanity_info($value);
Line 834  sub plink { Line 818  sub plink {
     my ($type,$dis,$value,$marker,$return,$call)=@_;      my ($type,$dis,$value,$marker,$return,$call)=@_;
     my $winvalue=$value;      my $winvalue=$value;
     unless ($winvalue) {      unless ($winvalue) {
         if ((&isdateparm($type)) || (&is_specialstring($type))) {      if (&isdateparm($type)) {
             $winvalue=$env{'form.recent_'.$type};              $winvalue=$env{'form.recent_'.$type};
         } elsif ($type eq 'string_yesno') {  
             if ($env{'form.recent_string'} =~ /^(yes|no)$/i) {  
                 $winvalue=$env{'form.recent_string'};  
             }  
         } else {          } else {
             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};              $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
         }          }
Line 872  sub page_js { Line 852  sub page_js {
     $pjump_def      $pjump_def
   
     function psub() {      function psub() {
         var specstring = /^string_!(yesno|any)/i;  
         if (document.parmform.pres_marker.value!='') {          if (document.parmform.pres_marker.value!='') {
             document.parmform.action+='#'+document.parmform.pres_marker.value;              document.parmform.action+='#'+document.parmform.pres_marker.value;
             var typedef=new Array();              var typedef=new Array();
             typedef=document.parmform.pres_type.value.split('_');              typedef=document.parmform.pres_type.value.split('_');
             if (document.parmform.pres_type.value!='') {             if (document.parmform.pres_type.value!='') {
                 if ((typedef[0]=='date') ||              if (typedef[0]=='date') {
                     (specstring.test(document.parmform.pres_type.value)))  {                  eval('document.parmform.recent_'+
                     eval('document.parmform.recent_'+                       document.parmform.pres_type.value+
                         document.parmform.pres_type.value+               '.value=document.parmform.pres_value.value;');
                         '.value=document.parmform.pres_value.value;');              } else {
                 } else {                  eval('document.parmform.recent_'+typedef[0]+
                     eval('document.parmform.recent_'+typedef[0]+               '.value=document.parmform.pres_value.value;');
                         '.value=document.parmform.pres_value.value;');  
                 }  
             }              }
          }
             document.parmform.submit();              document.parmform.submit();
         } else {          } else {
             document.parmform.pres_value.value='';              document.parmform.pres_value.value='';
Line 929  function showHide_courseContent() { Line 907  function showHide_courseContent() {
 COURSECONTENTSCRIPT  COURSECONTENTSCRIPT
 }  }
   
 sub validateparms_js {  
     return <<'ENDSCRIPT';  
   
 function validateParms() {  
     var ipallowRegExp = /^setipallow_/;  
     var ipdenyRegExp = /^setipdeny_/;  
     var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;  
     if ((document.parmform.elements.length != 'undefined')  && (document.parmform.elements.length) != 'null') {  
         if (document.parmform.elements.length) {  
             for (i=0; i<document.parmform.elements.length; i++) {  
                 var name=document.parmform.elements[i].name;  
                 if (ipallowRegExp.test(name)) {  
                     var identifier = name.replace(ipallowRegExp,'');  
                     var possallow = document.parmform.elements[i].value;  
                     possallow = possallow.replace(/^\s+|\s+$/g,'');  
                     if (patternIP.test(possallow)) {  
                         if (document.parmform.elements['set_'+identifier].value) {  
                             possallow = ','+possallow;  
                         }  
                         document.parmform.elements['set_'+identifier].value += possallow;  
                     }  
                 } else if (ipdenyRegExp.test(name)) {  
                     var identifier = name.replace(ipdenyRegExp,'');  
                     var possdeny = document.parmform.elements[i].value;  
                     possdeny = possdeny.replace(/^\s+|\s+$/g,'');  
                     if (patternIP.test(possdeny)) {  
                         possdeny = '!'+possdeny;  
                         if (document.parmform.elements['set_'+identifier].value) {  
                             possdeny = ','+possdeny;  
                         }  
                     }  
                 }  
             }  
         }  
     }  
     return true;  
 }  
   
 ENDSCRIPT  
 }  
   
 # Javascript initialization, for overview mode  
 sub ipacc_boxes_js  {  
     my $remove = &mt('Remove');  
     return <<"END";  
 \$(document).ready(function() {  
     var wrapper         = \$(".LC_string_ipacc_wrap");  
     var add_button      = \$(".LC_add_ipacc_button");  
     var ipaccRegExp     = /^LC_string_ipacc_/;  
   
     \$(add_button).click(function(e){  
         e.preventDefault();  
         var identifier = \$(this).closest("div").attr("id");  
         identifier = identifier.replace(ipaccRegExp,'');  
         \$(this).closest('div').find('.LC_string_ipacc_inner').append('<div><input type="text" name="setip'+identifier+'" /><a href="#" class="LC_remove_ipacc">$remove</a></div>');  
     });  
   
     \$(wrapper).delegate(".LC_remove_ipacc","click", function(e){  
         e.preventDefault(); \$(this).closest("div").remove();  
     })  
 });  
   
   
 END  
 }  
   
 sub done_proctor_js {  
     return <<"END";  
 function toggleSecret(form,radio,key) {  
     var radios = form[radio+key];  
     if (radios.length) {  
         for (var i=0; i<radios.length; i++) {  
             if (radios[i].checked) {  
                 if (radios[i].value == '_done_proctor') {  
                     if (document.getElementById('done_'+key+'_proctorkey')) {  
                         document.getElementById('done_'+key+'_proctorkey').type='text';  
                     }  
                 } else {  
                     if (document.getElementById('done_'+key+'_proctorkey')) {  
                         document.getElementById('done_'+key+'_proctorkey').type='hidden';  
                         document.getElementById('done_'+key+'_proctorkey').value='';  
                     }  
                 }  
             }  
         }  
     }  
 }  
 END  
   
 }  
   
 sub startpage {  sub startpage {
     my ($r,$psymb) = @_;      my ($r,$psymb) = @_;
   
Line 1391  sub isdateparm { Line 1278  sub isdateparm {
     return (($type=~/^date/) && (!($type eq 'date_interval')));      return (($type=~/^date/) && (!($type eq 'date_interval')));
 }  }
   
 # Determine if parameter type is specialized string type (i.e.,  
 # not just string or string_yesno.  
   
 sub is_specialstring {  
     my $type=shift;  
     return (($type=~/^string_/) && (($type ne 'string_yesno')));  
 }  
   
 #  #
 # parmmenu displays a list of the selected parameters.  # parmmenu displays a list of the selected parameters.
 # It also offers a link to show/hide the complete parameter list  # It also offers a link to show/hide the complete parameter list
Line 1621  sub parmboxes { Line 1500  sub parmboxes {
         &whatIsMyCategory($tempparameter, \%categoryList);          &whatIsMyCategory($tempparameter, \%categoryList);
     }      }
     #part to print the parm-list      #part to print the parm-list
       $Text::Wrap::columns=60;
       $Text::Wrap::separator='<br />';
     $r->print('<div class="LC_columnSection">'."\n");      $r->print('<div class="LC_columnSection">'."\n");
   
     #Print parameters      #Print parameters
Line 1638  sub parmboxes { Line 1519  sub parmboxes {
             if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {              if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                 $r->print(' checked="checked"');                  $r->print(' checked="checked"');
             }              }
             $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}              $r->print(' />'.($$allparms{$tempkey}=~/\S/ ?
                                                       : $tempkey)                               Text::Wrap::wrap('','&nbsp;'x4,$$allparms{$tempkey})
                                : $tempkey)
                      .'</label></span><br />'."\n");                       .'</label></span><br />'."\n");
         }          }
         $r->print("</div>\n");          $r->print("</div>\n");
Line 1865  sub displaymenu { Line 1747  sub displaymenu {
 }  }
   
 sub mapmenu {  sub mapmenu {
     my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;      my ($r,$allmaps,$pschp,$maptitles,$symbp,$parmlev)=@_;
     my %allmaps_inverted = reverse %$allmaps;      my %allmaps_inverted = reverse %$allmaps;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $tree=[];      my $tree=[];
Line 1913  sub mapmenu { Line 1795  sub mapmenu {
         }          }
     }      }
 # Show it ...      # Show it ...    
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',' id="mapmenu"'));      my $rowattr = ' id="mapmenu"';
       if ($parmlev eq 'general') {
           $rowattr .= ' style="display:none"';
       }
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',$rowattr));
     if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {      if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {
         my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';          my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';
         my $whitespace =          my $whitespace =
Line 2324  sub assessparms { Line 2210  sub assessparms {
                             foreach my $role (@possroles) {                              foreach my $role (@possroles) {
                                 if (ref($sections_by_role{$role}) eq 'ARRAY') {                                  if (ref($sections_by_role{$role}) eq 'ARRAY') {
                                     my @secs = sort { $a <=> $b } @{$sections_by_role{$role}};                                      my @secs = sort { $a <=> $b } @{$sections_by_role{$role}};
                                     $csec = $secs[0];                                      $csec = $secs[0]; 
                                     last;                                      last;
                                 }                                  }
                             }                              }
Line 2368  sub assessparms { Line 2254  sub assessparms {
                                          $uname,$udom);                                           $uname,$udom);
                     }                      }
                     $message .= '</span>';                      $message .= '</span>';
                     $uname='';                      $uname=''; 
                     if ($env{'request.course.sec'} ne '') {                      if ($env{'request.course.sec'} ne '') {
                         $csec=$env{'request.course.sec'};                          $csec=$env{'request.course.sec'};
                     } else {                      } else {
Line 2390  sub assessparms { Line 2276  sub assessparms {
             if ($uname ne '') {              if ($uname ne '') {
                 my %name=&Apache::lonnet::userenvironment($udom,$uname,                  my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   ('firstname','middlename','lastname','generation','id'));                    ('firstname','middlename','lastname','generation','id'));
                 $message .= "\n<p>\n".&mt('Full Name').': '                   $message .= "\n<p>\n".&mt('Full Name').': '
                             .$name{'firstname'}.' '.$name{'middlename'}.' '                              .$name{'firstname'}.' '.$name{'middlename'}.' '
                             .$name{'lastname'}.' '.$name{'generation'}                              .$name{'lastname'}.' '.$name{'generation'}
                             ."<br />\n".&mt('Student/Employee ID').': '.$name{'id'}.'</p>';                              ."<br />\n".&mt('Student/Employee ID').': '.$name{'id'}.'</p>';
Line 2428  sub assessparms { Line 2314  sub assessparms {
         my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};          my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
         my ($got_chostname,$chostname,$cmajor,$cminor);          my ($got_chostname,$chostname,$cmajor,$cminor);
         my $totalstored = 0;          my $totalstored = 0;
           my $totalskippeduser = 0;
         my $now = time;          my $now = time;
         for (my $i=0;$i<=$#markers;$i++) {          for (my $i=0;$i<=$#markers;$i++) {
             my ($needsrelease,$needsnewer,$name);              my ($needsrelease,$needsnewer,$name);
Line 2436  sub assessparms { Line 2323  sub assessparms {
             }              }
             if ($markers[$i] =~ /\&(6|5|4)$/) {              if ($markers[$i] =~ /\&(6|5|4)$/) {
                 next if ($noeditgrp);                  next if ($noeditgrp);
               } elsif ($markers[$i] =~ /\&(3|2|1)$/) {
                   if ($uname eq '') {
                       $totalskippeduser ++;
                       next;
                   }
             }              }
             if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {              if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
                 my (@ok_slots,@fail_slots,@del_slots);                  my (@ok_slots,@fail_slots,@del_slots);
Line 2513  sub assessparms { Line 2405  sub assessparms {
 # ---------------------------------------------------------------- Done storing  # ---------------------------------------------------------------- Done storing
         if ($totalstored) {          if ($totalstored) {
             $message.='<p class="LC_warning">'              $message.='<p class="LC_warning">'
                        .&mt('Changes for [quant,_1,parameter] saved.',$totalstored)
                        .'<br />'
                      .&mt('Changes can take up to 10 minutes before being active for all students.')                       .&mt('Changes can take up to 10 minutes before being active for all students.')
                      .&Apache::loncommon::help_open_topic('Caching')                       .&Apache::loncommon::help_open_topic('Caching')
                      .'</p>';                       .'</p>';
           } else {
               $message.='<p class="LC_info">'.&mt('No parameter changes saved.').'</p>';
           }
           if ($totalskippeduser) {
               $message .= '<p class="LC_warning">';
               if ($uhome eq 'no_host') {
                   $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the username or ID was invalid.',
                                   $totalskippeduser);
               } elsif ($env{'form.userroles'} eq 'any') {
                   $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user does not have a course role.',
                                   $totalskippeduser);
               } else {
                   $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user is not a student.',
                                   $totalskippeduser);
               }
               $message .= '</p>';
         }          }
     }      }
 #----------------------------------------------- if all selected, fill in array  #----------------------------------------------- if all selected, fill in array
Line 2526  sub assessparms { Line 2436  sub assessparms {
   
     &startpage($r,$pssymb);      &startpage($r,$pssymb);
   
     foreach my $item ('tolerance','date_default','date_start','date_end',      foreach ('tolerance','date_default','date_start','date_end',
                       'date_interval','int','float','string','string_lenient',          'date_interval','int','float','string') {
                       'string_examcode','string_deeplink','string_discussvote',  
                       'string_useslots','string_problemstatus','string_ip',  
                       'string_questiontype') {  
         $r->print('<input type="hidden" value="'.          $r->print('<input type="hidden" value="'.
           &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').            &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
           '" name="recent_'.$item.'" />');            '" name="recent_'.$_.'" />');
     }      }
   
     # ----- Start Parameter Selection      # ----- Start Parameter Selection
Line 2570  ENDPARMSELSCRIPT Line 2477  ENDPARMSELSCRIPT
         $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));          $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
         &levelmenu($r,\%alllevs,$parmlev);          &levelmenu($r,\%alllevs,$parmlev);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);          &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
         &partmenu($r,\%allparts,\@psprt);          &partmenu($r,\%allparts,\@psprt);
Line 2865  ENDTABLEHEADFOUR Line 2772  ENDTABLEHEADFOUR
   
 #-------------------------------------------- for each map, gather information  #-------------------------------------------- for each map, gather information
             my $mapid;              my $mapid;
                foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {                 foreach $mapid (sort { $a <=> $b } keys(%maplist)) {
                 my $maptitle = $maplist{$mapid};                  my $maptitle = $maplist{$mapid};
   
 #-----------------------  loop through ids and get all parameter types for map  #-----------------------  loop through ids and get all parameter types for map
Line 3145  sub storedata { Line 3052  sub storedata {
     if ($key =~ /^form\.([a-z]+)\_(.+)$/) {      if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
         my $cmd=$1;          my $cmd=$1;
         my $thiskey=$2;          my $thiskey=$2;
         next if ($cmd eq 'setipallow' || $cmd eq 'setipdeny');  
         my ($tuname,$tudom)=&extractuser($thiskey);          my ($tuname,$tudom)=&extractuser($thiskey);
         my $tkey=$thiskey;          my $tkey=$thiskey;
             if ($tuname) {              if ($tuname) {
Line 3416  sub listdata { Line 3322  sub listdata {
         $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';          $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';
         } elsif ($middle) {          } elsif ($middle) {
         my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);          my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
           next if (($url =~ /\.(page|sequence)$/) && ($parmlev eq 'full') && ($caller eq 'newoverview'));
         $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';          $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.$id.')</span></span>';
         }          }
         if ($sortorder eq 'realmstudent') {          if ($sortorder eq 'realmstudent') {
Line 3486  sub listdata { Line 3393  sub listdata {
               );                );
             }              }
         } elsif ($thistype eq 'date_interval') {          } elsif ($thistype eq 'date_interval') {
             $r->print(&date_interval_selector($thiskey,$name,              $r->print(&date_interval_selector($thiskey,
                       $$resourcedata{$thiskey},$readonly));                        $$resourcedata{$thiskey},$readonly));
         } elsif ($thistype =~ m/^string/) {          } elsif ($thistype =~ m/^string/) {
             if ($name eq 'availablestudent') {              if ($name eq 'availablestudent') {
Line 3509  sub listdata { Line 3416  sub listdata {
   
   
 sub date_interval_selector {  sub date_interval_selector {
     my ($thiskey, $pname, $showval, $readonly) = @_;      my ($thiskey, $showval, $readonly) = @_;
     my ($result,%skipval);      my $result;
     my $currval = $showval;      my $currval = $showval;
     foreach my $which (['days', 86400, 31],      foreach my $which (['days', 86400, 31],
                ['hours', 3600, 23],                 ['hours', 3600, 23],
                ['minutes', 60, 59],                 ['minutes', 60, 59],
                ['seconds',  1, 59]) {                 ['seconds',  1, 59]) {
     my ($name, $factor, $max) = @{ $which };          my ($name, $factor, $max) = @{ $which };
     my $amount = int($showval/$factor);          my $amount = int($showval/$factor);
     $showval  %= $factor;          $showval  %= $factor;
     my %select = ((map {$_ => $_} (0..$max)),          my %select = ((map {$_ => $_} (0..$max)),
               'select_form_order' => [0..$max]);                        'select_form_order' => [0..$max]);
     $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,          if ($currval eq '') {
                            \%select,'',$readonly);              unshift(@{$select{'select_form_order'}},'');
     $result .= ' '.&mt($name);              $select{''} = '';
     }              $amount = '';
     if ($pname eq 'interval') {          }
         unless ($skipval{'done'}) {          $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
             my $checkedon = '';                                                     \%select,'',$readonly);
             my $checkedproc = '';          $result .= ' '.&mt($name);
             my $currproctorkey = '';  
             my $currprocdisplay = 'hidden';  
             my $currdonetext = &mt('Done');  
             my $checkedoff = ' checked="checked"';  
             if ($currval =~ /^(?:\d+)_done$/) {  
                 $checkedon = ' checked="checked"';  
                 $checkedoff = '';  
             } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {  
                 $currdonetext = $1;  
                 $checkedon = ' checked="checked"';  
                 $checkedoff = '';  
             } elsif ($currval =~ /^(?:\d+)_done_proctor_(.+)$/) {  
                 $currproctorkey = $1;  
                 $checkedproc = ' checked="checked"';  
                 $checkedoff = '';  
                 $currprocdisplay = 'text';  
             } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:_proctor_(.+)$/) {  
                 $currdonetext = $1;  
                 $currproctorkey = $2;  
                 $checkedproc = ' checked="checked"';  
                 $checkedoff = '';  
                 $currprocdisplay = 'text';  
             }  
             my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';  
             my $disabled;  
             if ($readonly) {  
                 $disabled = ' disabled="disabled"';  
             }  
             $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').  
                        '<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.$disabled.' />'.  
                        &mt('No').'</label>'.('&nbsp;'x2).  
                        '<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.$disabled.' />'.  
                        &mt('Yes').'</label>'.('&nbsp;'x2).  
                        '<label><input type="radio" value="_done_proctor" name="done_'.$thiskey.'"'.$checkedproc.$onclick.$disabled.' />'.  
                        &mt('Yes, with proctor key').'</label>'.  
                        '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.  
                        'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.  
                        '<span class="LC_nobreak">'.&mt('Button text').': '.  
                        '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';  
         }  
     }      }
     unless ($readonly) {      unless ($readonly) {
         $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';          $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
Line 3580  sub date_interval_selector { Line 3447  sub date_interval_selector {
 sub get_date_interval_from_form {  sub get_date_interval_from_form {
     my ($key) = @_;      my ($key) = @_;
     my $seconds = 0;      my $seconds = 0;
       my $numnotnull = 0;
     foreach my $which (['days', 86400],      foreach my $which (['days', 86400],
                ['hours', 3600],                 ['hours', 3600],
                ['minutes', 60],                 ['minutes', 60],
                ['seconds',  1]) {                 ['seconds',  1]) {
     my ($name, $factor) = @{ $which };          my ($name, $factor) = @{ $which };
     if (defined($env{'form.'.$name.'_'.$key})) {          if (defined($env{'form.'.$name.'_'.$key})) {
         $seconds += $env{'form.'.$name.'_'.$key} * $factor;              unless ($env{'form.'.$name.'_'.$key} eq '') {
     }                  $numnotnull ++;
                   $seconds += $env{'form.'.$name.'_'.$key} * $factor;
               }
           }
     }      }
       return if (!$numnotnull);
     return $seconds;      return $seconds;
 }  }
   
Line 3602  sub default_selector { Line 3474  sub default_selector {
     return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' />';      return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' />';
 }  }
   
 sub string_ip_selector {  
     my ($thiskey, $showval, $readonly) = @_;  
     my %access = (  
                    allow => [],  
                    deny  => [],  
                  );  
     if ($showval ne '') {  
         my @current;  
         if ($showval =~ /,/) {  
             @current = split(/,/,$showval);  
         } else {  
             @current = ($showval);  
         }  
         foreach my $item (@current) {  
             if ($item =~ /^\!([\[\]a-zA-Z\.\d\*\-]+)$/) {  
                 push(@{$access{'deny'}},$1);  
             } elsif ($item =~ /^([\[\]a-zA-Z\.\d\*\-]+)$/) {  
                 push(@{$access{'allow'}},$item);  
             }  
         }  
     }  
     if (!@{$access{'allow'}}) {  
         @{$access{'allow'}} = ('');  
     }  
     if (!@{$access{'deny'}}) {  
         @{$access{'deny'}} = ('');  
     }  
     my ($disabled,$addmore);  
     if ($readonly) {  
         $disabled=' disabled="disabled"';  
     } else {  
         $addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';  
     }  
     my $output = '<input type="hidden" name="set_'.$thiskey.'" />  
 <table><tr><th>'.&mt('Allow from').'</th><th>'.&mt('Deny from').'</th></tr><tr>';  
     foreach my $acctype ('allow','deny') {  
         $output .= '  
 <td valign="top">  
 <div class="LC_string_ipacc_wrap" id="LC_string_ipacc_'.$acctype.'_'.$thiskey.'">  
   <div class="LC_string_ipacc_inner">'."\n";  
         my $num = 0;  
         foreach my $curr (@{$access{$acctype}}) {  
             $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' />';  
             if ($num > 0) {  
                 $output .= '<a href="#" class="LC_remove_ipacc">'.&mt('Remove').'</a>';  
             }  
             $output .= '</div>'."\n";  
             $num ++;  
         }  
         $output .= '  
   </div>'.$addmore.'  
 </div>  
 </td>';  
    }  
    $output .= '  
 </tr>  
 </table>'."\n";  
     return $output;  
 }  
   
 {  
   
 my %strings =  my %strings =
     (      (
      'string_yesno'       'string_yesno'
Line 3691  my %strings = Line 3501  my %strings =
              => [['yes','Yes'],               => [['yes','Yes'],
                  ['notended','Yes, unless discussion ended'],                   ['notended','Yes, unless discussion ended'],
                  ['no','No']],                   ['no','No']],
      'string_ip'  
              => [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],  
                  ['_denyfrom_','Hostname(s) or IP(s) from which access is disallowed']],  
      );       );
   
 sub standard_string_options {  sub standard_string_options {
Line 3734  sub string_selector { Line 3541  sub string_selector {
             }              }
         }          }
     }      }
   
     if ($thistype eq 'string_ip') {  
         return &string_ip_selector($thiskey,$showval,$readonly);  
     }  
     
     my ($result,$disabled);      my ($result,$disabled);
   
Line 3792  sub string_selector { Line 3595  sub string_selector {
     return $result;      return $result;
 }  }
   
 sub oldversion_warning {  
     my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;  
     my $desc;  
     my %stringtypes = (  
                         type         => 'string_questiontype',  
                         lenient      => 'string_lenient',  
                         retrypartial => 'string_yesno',  
                         discussvote  => 'string_discussvote',  
                         examcode     => 'string_examcode',  
                       );  
     if (exists($stringtypes{$name})) {  
         if ($name eq 'examcode') {  
             $desc = $value;  
         } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {  
             foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {  
                 next unless (ref($possibilities) eq 'ARRAY');  
                 my ($parmval, $description) = @{ $possibilities };  
                 if ($parmval eq $value) {  
                     $desc = $description;  
                     last;  
                 }  
             }  
         }  
     } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) {  
         my $now = time;  
         if ($value =~ /^\d+$/) {  
             if ($name eq 'printstartdate') {  
                 if ($value > $now) {  
                     $desc = &Apache::lonlocal::locallocaltime($value);  
                 }  
             } elsif ($name eq 'printenddate') {  
                 if ($value < $now) {  
                     $desc = &Apache::lonlocal::locallocaltime($value);  
                 }  
             }  
         }  
     }  
     my $standard_name = &standard_parameter_names($name);  
     return '<p class="LC_warning">'.  
            &mt('[_1] was [_2]not[_3] set to [_4].',  
                $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.  
            &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',  
            $cmajor.'.'.$cminor,$chostname,  
            $needsrelease).  
            '</p>';  
 }  
   
 }  
   
 #  #
 # Shift all start and end dates by $shift  # Shift all start and end dates by $shift
 #  #
Line 3914  sub newoverview { Line 3668  sub newoverview {
 '.  '.
             &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".              &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".
             &showhide_js()."\n".              &showhide_js()."\n".
             &done_proctor_js()."\n".  
 '// ]]>  '// ]]>
 </script>  </script>
 ';  ';
Line 3989  ENDOVER Line 3742  ENDOVER
     $r->print('<div>');      $r->print('<div>');
     $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));      $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
     &levelmenu($r,\%alllevs,$parmlev);      &levelmenu($r,\%alllevs,$parmlev);
     if ($parmlev ne 'general') {      $r->print(&Apache::lonhtmlcommon::row_closure());
         $r->print(&Apache::lonhtmlcommon::row_closure());      &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
         &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp);  
     }  
     $r->print(&Apache::lonhtmlcommon::row_closure(1));      $r->print(&Apache::lonhtmlcommon::row_closure(1));
     $r->print(&Apache::lonhtmlcommon::end_pick_box());      $r->print(&Apache::lonhtmlcommon::end_pick_box());
     $r->print('</div></div>');      $r->print('</div></div>');
Line 4104  sub overview { Line 3855  sub overview {
     my ($r,$parm_permission) = @_;      my ($r,$parm_permission) = @_;
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};  
     my $js = '<script type="text/javascript">'."\n".  
              '// <![CDATA['."\n".  
              &done_proctor_js()."\n".  
              '// ]]>'."\n".  
              '</script>'."\n";  
     my $readonly = 1;      my $readonly = 1;
     if ($parm_permission->{'edit'}) {      if ($parm_permission->{'edit'}) {
         undef($readonly);          undef($readonly);
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
     text=>"Overview Mode"});      text=>"Overview Mode"});
     my $start_page=&Apache::loncommon::start_page('Modify Parameters',$js);      my $start_page=&Apache::loncommon::start_page('Modify Parameters');
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
     $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform">');      $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform">');
Line 5414  sub parameter_releasecheck { Line 5159  sub parameter_releasecheck {
     return $needsnewer;      return $needsnewer;
 }  }
   
   sub oldversion_warning {
       my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
       my $desc;
       my %stringtypes = (
                           type         => 'string_questiontype',
                           lenient      => 'string_lenient',
                           retrypartial => 'string_yesno',
                           discussvote  => 'string_discussvote',
                           examcode     => 'string_examcode',
                         );
       if (exists($stringtypes{$name})) {
           if ($name eq 'examcode') {
               $desc = $value;
           } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
               foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
                   next unless (ref($possibilities) eq 'ARRAY');
                   my ($parmval, $description) = @{ $possibilities };
                   if ($parmval eq $value) {
                       $desc = $description;
                       last;
                   }
               }
           }
       } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) {
           my $now = time;
           if ($value =~ /^\d+$/) {
               if ($name eq 'printstartdate') {
                   if ($value > $now) {
                       $desc = &Apache::lonlocal::locallocaltime($value);
                   }
               } elsif ($name eq 'printenddate') {
                   if ($value < $now) {
                       $desc = &Apache::lonlocal::locallocaltime($value);
                   }
               }
           }
       }
       my $standard_name = &standard_parameter_names($name);
       return '<p class="LC_warning">'.
              &mt('[_1] was [_2]not[_3] set to [_4].',
                  $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.
              &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
              $cmajor.'.'.$cminor,$chostname,
              $needsrelease).
              '</p>';
   }
   
 sub get_permission {  sub get_permission {
     my %permission;      my %permission;
     my $allowed = 0;      my $allowed = 0;

Removed from v.1.522.2.26.2.3  
changed lines
  Added in v.1.522.2.31


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