Diff for /loncom/interface/lonparmset.pm between versions 1.622 and 1.624

version 1.622, 2025/06/28 14:34:46 version 1.624, 2025/06/30 21:12:21
Line 329  use Apache::lonnavmaps; Line 329  use Apache::lonnavmaps;
 use Apache::longroup;  use Apache::longroup;
 use Apache::lonrss;  use Apache::lonrss;
 use HTML::Entities;  use HTML::Entities;
   use POSIX qw (floor);
 use Text::Wrap();  use Text::Wrap();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
Line 1003  sub valout { Line 1004  sub valout {
                 foreach my $item (@items) {                  foreach my $item (@items) {
                     if ($item =~ /^\d+:(0|1)\.?\d*:(0|1)$/) {                      if ($item =~ /^\d+:(0|1)\.?\d*:(0|1)$/) {
                         my ($totalsecs,$fraction,$grad) = split(/:/,$item);                          my ($totalsecs,$fraction,$grad) = split(/:/,$item);
                         $result .= &interval_to_humanstr($totalsecs);                          $result .= &grace_to_humanstr($totalsecs);
                         if (($fraction >=0) && ($fraction <=1)) {                          if (($fraction >=0) && ($fraction <=1)) {
                             $result .= '&nbsp;|&nbsp;'.$fraction.'&nbsp;'.&mt('pts');                              $result .= '&nbsp;|&nbsp;'.$fraction.'&nbsp;'.&mt('pts');
                             if ($grad == 1) {                              if ($grad == 1) {
Line 1076  sub interval_to_humanstr { Line 1077  sub interval_to_humanstr {
     return '<span style="white-space:nowrap">'.join('</span>, <span style="white-space:nowrap">',@timer).'</span>';      return '<span style="white-space:nowrap">'.join('</span>, <span style="white-space:nowrap">',@timer).'</span>';
 }  }
   
   sub grace_to_humanstr {
       my ($totalsecs) = @_;
       my @timer;
       my $weeks = floor($totalsecs/604800);
       $totalsecs -= $weeks*604800;
       my $days = floor($totalsecs/86400);
       $totalsecs -= $days*86400;
       my $hours = floor($totalsecs/3600);
       $totalsecs -= $hours*3600;
       my $mins= floor($totalsecs/60);
       $totalsecs -= $mins*60;
       if ($weeks) {
           push(@timer,&mt('[quant,_1,wk]',$weeks));
       }
       if ($days) {
           push(@timer,&mt('[quant,_1,day]',$days));
       }
       if ($hours) {
           push(@timer,&mt('[quant,_1,hr]',$hours));
       }
       if ($mins) {
           push(@timer,&mt('[quant,_1,min]',$mins));
       }
       if (!@timer) { # Special case: all entries 0 -> display "0 mins" intead of empty field to keep this field editable
           push(@timer,&mt('[quant,_1,min]',0));
       }
       return '<span style="white-space:nowrap">'.join('</span>, <span style="white-space:nowrap">',@timer).'</span>';
   }
   
 # Returns HTML containing a link on a parameter value, for table mode.  # Returns HTML containing a link on a parameter value, for table mode.
 # The link uses the javascript function 'pjump'.  # The link uses the javascript function 'pjump'.
 #  #
Line 1278  function validateParms() { Line 1308  function validateParms() {
     var dlExitRegExp = /^deeplink_exit_/;      var dlExitRegExp = /^deeplink_exit_/;
     var dlExitTextRegExp = /^deeplink_exittext_/;      var dlExitTextRegExp = /^deeplink_exittext_/;
     var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;      var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;
       var patternGrace = /^\d+:(0|1)\.?\d*:(0|1)\$/;
     var numelements = document.parmform.elements.length;      var numelements = document.parmform.elements.length;
     if ((typeof(numelements) != 'undefined') && (numelements != null)) {      if ((typeof(numelements) != 'undefined') && (numelements != null)) {
         if (numelements) {          if (numelements) {
Line 1487  function validateParms() { Line 1518  function validateParms() {
                     var divElem = document.parmform.elements[i].closest('div');                       var divElem = document.parmform.elements[i].closest('div'); 
                     var timeSels = divElem.getElementsByTagName("select");                      var timeSels = divElem.getElementsByTagName("select");
                     var total = 0;                      var total = 0;
                       var numnotnull = 0;
                     if (timeSels.length) {                      if (timeSels.length) {
                          for (var j=0; j<timeSels.length; j++) {                           for (var j=0; j<timeSels.length; j++) {
                             var sname = timeSels[j].getAttribute('name');                              var sname = timeSels[j].getAttribute('name');
                             var poss = parseInt(timeSels[j].options[timeSels[j].selectedIndex].value);                              var value = timeSels[j].options[timeSels[j].selectedIndex].value;
                             if (sname == 'days_'+identifier) {                              if ((value !== null) && (value !== '') && (value !== 'undefined')) {
                                 if ((poss > 0) && (poss <= 31)) {                                  numnotnull ++;
                                     total += (poss * 86400);                                   var poss = parseInt(value);
                                 }                                  if (sname == 'weeks_'+identifier) {
                             } else if (sname == 'hours_'+identifier) {                                      if ((poss > 0) && (poss <= 52)) {
                                 if ((poss > 0) && (poss < 24)) {                                          total += (poss * 604800);
                                     total += (poss * 3600);                                      }
                                 }                                  } else if (sname == 'days_'+identifier) {
                             } else if (sname == 'minutes_'+identifier) {                                      if ((poss > 0) && (poss <= 6)) {
                                 if ((poss > 0) && (poss < 60)) {                                          total += (poss * 86400); 
                                     total += (poss * 60);                                      }
                                 }                                  } else if (sname == 'hours_'+identifier) {
                             } else if (sname == 'seconds_'+identifier) {                                      if ((poss > 0) && (poss < 24)) {
                                 if ((poss > 0) && (poss < 60)) {                                          total += (poss * 3600);
                                     total += poss;                                      }
                                   } else if (sname == 'minutes_'+identifier) {
                                       if ((poss > 0) && (poss < 60)) {
                                           total += (poss * 60);
                                       }
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                       if (!numnotnull) {
                           total = '';
                       }
                     var inputElems = divElem.getElementsByTagName("input");                      var inputElems = divElem.getElementsByTagName("input");
                     var frac = '';                      var frac = '';
                     var grad = '';                      var grad = '';
Line 1519  function validateParms() { Line 1558  function validateParms() {
                             if (iname == 'frac_'+identifier) {                              if (iname == 'frac_'+identifier) {
                                 var ival = inputElems[j].value;                                  var ival = inputElems[j].value;
                                 ival.trim();                                  ival.trim();
                                 var poss = parseFloat(ival);                                  if ((ival != '') && (value != 'undefined')) {
                                 if ((typeof poss === 'number') && (!isNaN(poss))) {                                      var poss = parseFloat(ival);
                                     if ((poss => 0) && (poss <= 1)) {                                      if ((typeof poss === 'number') && (!isNaN(poss))) {
                                         frac = poss;                                          if ((poss => 0) && (poss <= 1)) {
                                               frac = poss;
                                               numnotnull ++;
                                           }
                                     }                                      }
                                 }                                  }
                             } else if (iname == 'grad_'+identifier) {                              } else if (iname == 'grad_'+identifier) {
Line 1534  function validateParms() { Line 1576  function validateParms() {
                             }                              }
                         }                          }
                     }                      }
                     document.parmform.elements[i].value = total+':'+frac+':'+grad;                      if (numnotnull) {
                     if (document.parmform.elements['set_'+identifier].value) {                          var possgrace = total+':'+frac+':'+grad;   
                         document.parmform.elements['set_'+identifier].value += ',';                          if (patternGrace.test(possgrace)) {
                               document.parmform.elements[i].value = possgrace;
                               if (document.parmform.elements['set_'+identifier].value) {
                                   document.parmform.elements['set_'+identifier].value += ',';
                               }
                               document.parmform.elements['set_'+identifier].value += document.parmform.elements[i].value;
                           } else {
                               if (frac == '') {
                                   alert('Grace Period Past-Due: enter partial credit (number between 0 and 1.0).');
                                   return false;
                               } else {
                                   alert('Grace Period Past-Due: select a number in at least one of the time past due select boxes, or delete the value for partial credit.');
                                   return false;
                               }
                           }
                     }                      }
                     document.parmform.elements['set_'+identifier].value += document.parmform.elements[i].value;  
                 }                  }
             }              }
         }          }
Line 1595  sub grace_js { Line 1650  sub grace_js {
     my %lt = &grace_titles();      my %lt = &grace_titles();
     &js_escape(\%lt);      &js_escape(\%lt);
     my $overdue = '<fieldset class="LC_grace"><legend>'.$lt{'sinc'}.'</legend>';      my $overdue = '<fieldset class="LC_grace"><legend>'.$lt{'sinc'}.'</legend>';
     foreach my $which (['days', 86400, 31],      foreach my $which (['weeks', 604800, 52],
                          ['days', 86400, 6],
                        ['hours', 3600, 23],                         ['hours', 3600, 23],
                        ['minutes', 60, 59],                         ['minutes', 60, 59]) {
                        ['seconds',  1, 59]) {  
         my ($name, $factor, $max) = @{ $which };          my ($name, $factor, $max) = @{ $which };
         my %select = ((map {$_ => $_} (0..$max)),          my %select = ((map {$_ => $_} (0..$max)),
                       'select_form_order' => [0..$max]);                        'select_form_order' => [0..$max]);
           unshift(@{$select{'select_form_order'}},'');
           $select{''} = '';
         my $selector = &Apache::loncommon::select_form('',$name."_'+identifier+'",          my $selector = &Apache::loncommon::select_form('',$name."_'+identifier+'",
                                                        \%select);                                                         \%select);
         $selector =~ s/([\r\n\f]+)//g;          $selector =~ s/([\r\n\f]+)//g;
Line 1618  sub grace_js { Line 1675  sub grace_js {
         e.preventDefault();          e.preventDefault();
         var identifier = \$(this).closest("div").attr("id");          var identifier = \$(this).closest("div").attr("id");
         identifier = identifier.replace(graceRegExp,'');          identifier = identifier.replace(graceRegExp,'');
         \$(this).closest('div').find('.LC_string_grace_inner').append('<div><input type="hidden" name="setgrace_'+identifier+'" value="" />$overdue<fieldset class="LC_grace"><legend>$lt{scor}</legend><input type="text" size="3" name="frac_'+identifier+'" value="" />&nbsp;&nbsp;<label><input type="checkbox" value="1" name="grad_'+identifier+'" />$lt{grad}</label></fieldset><a href="#" class="LC_remove_grace">$lt{remo}</a></div>');          \$(this).closest('div').find('.LC_string_grace_inner').append('<div><input type="hidden" name="setgrace_'+identifier+'" value="" />$overdue<fieldset class="LC_grace"><legend>$lt{pcr}</legend><input type="text" size="3" name="frac_'+identifier+'" value="" />&nbsp;&nbsp;<label><input type="checkbox" value="1" name="grad_'+identifier+'" />$lt{grad}</label></fieldset><a href="#" class="LC_remove_grace">$lt{remo}</a></div>');
     });      });
   
     \$(wrapper).delegate(".LC_remove_grace","click", function(e){      \$(wrapper).delegate(".LC_remove_grace","click", function(e){
Line 5298  sub get_date_interval_from_form { Line 5355  sub get_date_interval_from_form {
     return $seconds;      return $seconds;
 }  }
   
   
 # Returns HTML to enter a text value for a parameter.  # Returns HTML to enter a text value for a parameter.
 #  #
 # @param {string} $thiskey - parameter key  # @param {string} $thiskey - parameter key
Line 5677  sub grace_form { Line 5733  sub grace_form {
     my %lt = &grace_titles();      my %lt = &grace_titles();
     my $output = '<div><input type="hidden" name="setgrace_'.$thiskey.'" value="" />'.      my $output = '<div><input type="hidden" name="setgrace_'.$thiskey.'" value="" />'.
                  '<fieldset class="LC_grace"><legend>'.$lt{'sinc'}.'</legend>';                   '<fieldset class="LC_grace"><legend>'.$lt{'sinc'}.'</legend>';
     foreach my $which (['days', 86400, 31],      foreach my $which (['weeks', 604800, 52],
                          ['days', 86400, 6],
                        ['hours', 3600, 23],                         ['hours', 3600, 23],
                        ['minutes', 60, 59],                         ['minutes', 60, 59]) {
                        ['seconds',  1, 59]) {  
         my ($name, $factor, $max) = @{ $which };          my ($name, $factor, $max) = @{ $which };
         my $amount;          my $amount;
         if ($delta ne '') {          my %select = ((map {$_ => $_} (0..$max)),
                         'select_form_order' => [0..$max]);
           if ($delta eq '') {
               unshift(@{$select{'select_form_order'}},'');
               $select{''} = '';
               $amount = '';
           } else {
             $amount = int($delta/$factor);              $amount = int($delta/$factor);
             $delta %= $factor;              $delta %= $factor;
         }          }
         my %select = ((map {$_ => $_} (0..$max)),  
                       'select_form_order' => [0..$max]);  
         $output .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,          $output .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                                                    \%select,'',$readonly);                                                     \%select,'',$readonly);
         $output .= '&nbsp;'.$lt{$name}.'&nbsp;&nbsp; ';          $output .= '&nbsp;'.$lt{$name}.'&nbsp;&nbsp; ';
Line 5711  sub grace_titles { Line 5771  sub grace_titles {
                                          remo => 'Remove',                                           remo => 'Remove',
                                          pcr => 'Partial credit',                                           pcr => 'Partial credit',
                                          grad => 'gradual',                                           grad => 'gradual',
                                            weeks => 'weeks',
                                          days => 'days',                                           days => 'days',
                                          hours => 'hours',                                           hours => 'hours',
                                          minutes => 'minutes',                                           minutes => 'minutes',
                                          seconds => 'seconds',  
     );      );
 }  }
   
Line 6336  sub newoverview { Line 6396  sub newoverview {
     $r->print($start_page.$breadcrumbs);      $r->print($start_page.$breadcrumbs);
     &startSettingsScreen($r,'parmset',$crstype);      &startSettingsScreen($r,'parmset',$crstype);
     $r->print(<<ENDOVER);      $r->print(<<ENDOVER);
 <form method="post" action="/adm/parmset?action=newoverview" name="parmform" onsubmit="return validateParms();">  <form method="post" action="/adm/parmset?action=newoverview" name="parmform" id="newoverviewform">
   <input type="hidden" name="newoverviewsubm" value="dis" id="newoverviewsubm" />
 ENDOVER  ENDOVER
     my @ids=();      my @ids=();
     my %typep=();      my %typep=();
Line 6444  ENDOVER Line 6505  ENDOVER
     &sortmenu($r,$sortorder,'newoverview');      &sortmenu($r,$sortorder,'newoverview');
     $r->print('</div></div>');      $r->print('</div></div>');
   
     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');      $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" id="newoverviewdis" /></p>');
   
 # Build the list data hash from the specified parms  # Build the list data hash from the specified parms
   
Line 6456  ENDOVER Line 6517  ENDOVER
         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);          &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
     }      }
   
     if (($env{'form.store'}) || ($env{'form.dis'})) {      my $foundkeys;
       if ($env{'form.newoverviewsubm'}) {
   
         if ($env{'form.store'}) { &storedata($r,$crs,$dom); }          if ($env{'form.newoverviewsubm'} eq 'store') { &storedata($r,$crs,$dom); }
   
 # Read modified data  # Read modified data
   
Line 6474  ENDOVER Line 6536  ENDOVER
                 $hash_for_realm->{$symbp{$ids[$i]}} = $i;                  $hash_for_realm->{$symbp{$ids[$i]}} = $i;
             }              }
         }          }
         &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly,$parmlev,$hash_for_realm,$pschp);          $foundkeys = &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly,$parmlev,$hash_for_realm,$pschp);
     }      }
     $r->print(&tableend());      $r->print(&tableend());
     unless ($readonly) {      if ((!$readonly) && ($foundkeys)) {
         $r->print( ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'') );          $r->print( ($env{'form.newoverviewsubm'}? '<p><input type="submit" name="store" id="newoverviewstore" value="'.&mt('Save').'" /></p>':'') );
     }      }
     $r->print('</form>');      $r->print('</form>');
       if ($env{'form.newoverviewsubm'}) {
           $r->print(<<"END");
   <script type="text/javascript">
   const form = document.getElementById('newoverviewform');
   const storebutton = document.getElementById('newoverviewstore');
   const disbutton = document.getElementById('newoverviewdis');
   const submethod = document.getElementById('newoverviewsubm');
   if (storebutton) { 
     storebutton.addEventListener('keydown', (e) => {
       if (e.key === 'Enter') {
         if (validateParms()) {
           if (form) {
             if (submethod) {
               submethod.value='store';
             }
             form.submit();
           }
         }
         e.preventDefault();
         return;
       }
     });
     storebutton.addEventListener('click', (e) => {
       if (validateParms()) {
         if (form) {
           if (submethod) {
             submethod.value='store';
           }
           form.submit();
         }
       }
       e.preventDefault();
       return;
     });
   }
   if (disbutton) {
     disbutton.addEventListener('keydown', (e) => {
       if (e.key === 'Enter') {
         if (form) {
           if (submethod) {
             submethod.value='dis';
           }
           form.submit();
         }
         e.preventDefault();
       }
     });
     disbutton.addEventListener('click', (e) => {
       if (form) {
         if (submethod) {
           submethod.value='dis';
         }
         form.submit();
         return;
       }
       e.preventDefault();
     });
   }
   
   </script>
   
   END
       }
     &endSettingsScreen($r);      &endSettingsScreen($r);
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
 }  }

Removed from v.1.622  
changed lines
  Added in v.1.624


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