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 .= ' | '.$fraction.' '.&mt('pts'); |
$result .= ' | '.$fraction.' '.&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="" /> <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="" /> <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 .= ' '.$lt{$name}.' '; |
$output .= ' '.$lt{$name}.' '; |
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()); |
} |
} |