--- loncom/interface/courseprefs.pm 2023/06/03 02:29:57 1.122
+++ loncom/interface/courseprefs.pm 2025/01/07 16:19:19 1.133
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.122 2023/06/03 02:29:57 raeburn Exp $
+# $Id: courseprefs.pm,v 1.133 2025/01/07 16:19:19 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -316,7 +316,7 @@ sub handler {
idnu => 'Course ID or number',
unco => 'Unique code',
desc => 'Course Description',
- cred => 'Student credits',
+ cred => 'Student credits',
ownr => 'Course Owner',
cown => 'Course Co-owners',
catg => 'Categorize course',
@@ -372,6 +372,12 @@ sub handler {
my %values=&Apache::lonnet::dump('environment',$cdom,$cnum);
my %linkprot=&Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1);
+ my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
+ unless ($phase eq 'process') {
+ if (ref($domdefs{'linkprotsuggested'}) eq 'HASH') {
+ $values{'suggested'} = $domdefs{'linkprotsuggested'};
+ }
+ }
my %ltienc = &Apache::lonnet::dump('nohist_ltienc',$cdom,$cnum,undef,undef,undef,1);
my %ltitools = &Apache::lonnet::dump('ltitools',$cdom,$cnum,undef,undef,undef,1);
my %ltitoolsenc = &Apache::lonnet::dump('nohist_toolsenc',$cdom,$cnum,undef,undef,undef,1);
@@ -522,7 +528,7 @@ sub handler {
uselcmath => 'Student formula entry uses inline preview, not DragMath pop-up',
usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)',
inline_chem => 'Chemical reaction response uses inline preview, not pop-up',
- extresource => 'Display of external resources',
+ extresource => 'Display of external resources',
},
},
'grading' =>
@@ -694,6 +700,8 @@ sub get_allitems {
if ($item eq 'feedback') {
push(@allitems,(map { $_.'.text'; } @{$prefs{$item}{'ordered'}}));
}
+ } elsif (($item eq 'linkprot') || ($item eq 'ltitools')) {
+ push(@allitems,$item);
}
}
}
@@ -791,9 +799,38 @@ sub print_config_box {
';
+ if ($action eq 'linkprot') {
+ if ((ref($settings) eq 'HASH') && (ref($settings->{'suggested'}) eq 'HASH')) {
+ my $hints;
+ my $hintcount = 0;
+ foreach my $key (sort { $a <=> $b } keys(%{$settings->{'suggested'}})) {
+ if ((ref($settings->{'suggested'}->{$key}) eq 'HASH')) {
+ if (($settings->{'suggested'}->{$key}-{'name'} ne '') &&
+ ($settings->{'suggested'}->{$key}-{'info'} ne '')) {
+ my $css_class = $hintcount%2?' class="LC_odd_row"':' class="LC_even_row"';
+ $hints .= ''.
+ $settings->{'suggested'}->{$key}->{'name'}.' | '.
+ ''.
+ $settings->{'suggested'}->{$key}->{'info'}.
+ ' | ';
+ $hintcount ++;
+ }
+ }
+ }
+ if ($hintcount) {
+ $output .= ''.
+ ''.&mt('Recommendation(s) for specific launcher application(s)').' | '.
+ ' '."\n".
+ ''.
+ ''.&mt('Launcher Application').' | '.
+ ''.&mt('Recommendation(s)').' | '."\n".
+ $hints;
+ }
+ }
+ }
if (exists $item->{'header'}->[0]->{'col1'} ||
exists $item->{'header'}->[0]->{'col2'}) {
- $output .= '
+ $output .= '
'.&mt($item->{'header'}->[0]->{'col1'}).' | ';
if (($action eq 'courseinfo') || ($action eq 'localization') ||
@@ -820,7 +857,7 @@ sub print_config_box {
} elsif ($action eq 'appearance') {
$output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'grading') {
- $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
+ $output .= &print_grading($cdom,$cnum,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'printouts') {
$output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'spreadsheet') {
@@ -1337,14 +1374,14 @@ sub process_changes {
my ($classorder,$classtitles) = &discussion_vote_classes();
my $fontchange = 0;
foreach my $class (@{$classorder}) {
- my $ext_entry = $entry.'_'.$class;
+ my $ext_entry = $entry.'_'.$class;
my $size = $env{'form.'.$ext_entry.'_size'};
my $unit = $env{'form.'.$ext_entry.'_unit'};
my $weight = $env{'form.'.$ext_entry.'_weight'};
my $style = $env{'form.'.$ext_entry.'_style'};
my $other = $env{'form.'.$ext_entry.'_other'};
$size =~ s/,//g;
- $unit =~ s/,//g;
+ $unit =~ s/,//g;
$weight =~ s/,//g;
$style =~ s/,//g;
$other =~ s/[^\w;:\s\-\%.]//g;
@@ -1352,7 +1389,7 @@ sub process_changes {
$newvalues{$ext_entry} = join(',',($size.$unit,$weight,$style,$other));
my $current = $values->{$ext_entry};
if ($values->{$ext_entry} eq '') {
- $current = ',,,';
+ $current = ',,,';
}
if ($newvalues{$ext_entry} ne $current) {
$changes->{$ext_entry} = $newvalues{$ext_entry};
@@ -1361,7 +1398,7 @@ sub process_changes {
}
if ($fontchange) {
$changes->{$entry} = 1;
- }
+ }
} elsif ($entry eq 'nothideprivileged') {
my @curr_nothide;
my @new_nothide;
@@ -1436,7 +1473,7 @@ sub process_changes {
my $newtext = $maxnum-1;
$newhdr[$env{'form.printfmthdr_pos_'.$newtext}] = $env{'form.printfmthdr_text_'.$newtext};
$newvalues{$entry} = join('',@newhdr);
- } elsif (($entry eq 'languages') ||
+ } elsif (($entry eq 'languages') ||
($entry eq 'checkforpriv')) {
my $settings;
my $total = $env{'form.'.$entry.'_total'};
@@ -1452,7 +1489,7 @@ sub process_changes {
}
if ($env{'form.'.$entry.'_'.$total} ne '') {
my $new = $env{'form.'.$entry.'_'.$total};
- if ($entry eq 'languages') {
+ if ($entry eq 'languages') {
my %langchoices = &get_lang_choices();
if ($langchoices{$new}) {
$settings .= $new;
@@ -1548,10 +1585,37 @@ sub process_changes {
} elsif ($values->{$entry}) {
$changes->{$entry} = '';
}
+ } elsif ($entry eq 'grading') {
+ if ($env{'form.'.$entry} eq 'standard') {
+ if ($env{'form.hidetotals'}) {
+ my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
+ if (keys(%sections)) {
+ my @secs = &Apache::loncommon::get_env_multiple('form.hidetotals_sections');
+ if (grep(/^all$/,@secs)) {
+ $newvalues{'hidetotals'} = 'all';
+ } elsif (@secs) {
+ $newvalues{'hidetotals'} = '';
+ foreach my $sec (sort {$a <=> $b} @secs) {
+ if (exists($sections{$sec})) {
+ $newvalues{'hidetotals'} .= $sec.','
+ }
+ }
+ $newvalues{'hidetotals'} =~ s/,$//;
+ }
+ } else {
+ $newvalues{'hidetotals'} = 'all';
+ }
+ }
+ }
+ if ($newvalues{'hidetotals'} ne $values->{'hidetotals'}) {
+ $changes->{'hidetotals'} = $newvalues{'hidetotals'};
+ $changes->{'grading'} = $env{'form.'.$entry};
+ }
+ $newvalues{$entry} = $env{'form.'.$entry};
} else {
$newvalues{$entry} = $env{'form.'.$entry};
}
- unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts') ||
+ unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts') ||
($entry eq 'extresource') || ($entry eq 'timezone')) {
if ($newvalues{$entry} ne $values->{$entry}) {
$changes->{$entry} = $newvalues{$entry};
@@ -1680,6 +1744,9 @@ sub process_linkprot {
$haschanges{$itemid} = 1;
}
}
+ if ($env{$urlparamname} ne '') {
+ $linkprot{$itemid}{'returnurl'} = $env{$urlparamname};
+ }
if ($env{$passbackparamname} ne '') {
$linkprot{$itemid}{'passback'} = 1;
$linkprot{$itemid}{'passbackformat'} = $env{$passbackparamname};
@@ -1794,7 +1861,7 @@ sub get_linkprot_id {
$tries ++;
sleep (0.1);
if ($context eq 'domain') {
- $gotlock = &Apache::lonnet::newput_dom('linkprot',$lockhash,$cdom);
+ $gotlock = &Apache::lonnet::newput_dom('linkprot',$lockhash,$cdom);
} else {
$gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum);
}
@@ -1832,7 +1899,7 @@ sub get_linkprot_id {
$error = 'nonumber';
}
}
- my $dellockoutcome;
+ my $dellockoutcome;
if ($context eq 'domain') {
$dellockoutcome = &Apache::lonnet::del_dom('linkprot',['lock'],$cdom);
} else {
@@ -1911,7 +1978,7 @@ sub process_ltitools {
if ($env{'form.ltitools_add'}) {
my $title = $env{'form.ltitools_add_title'};
$title =~ s/(`)/'/g;
- my ($newid,$error) = &get_ltitools_id($context,$cdom,$cnum,$title);
+ my ($newid,$error) = &Apache::lonnet::get_ltitools_id($context,$cdom,$cnum,$title);
if ($newid) {
my $position = $env{'form.ltitools_add_pos'};
$position =~ s/\D+//g;
@@ -2365,73 +2432,6 @@ sub process_ltitools {
return $errors;
}
-sub get_ltitools_id {
- my ($context,$cdom,$cnum,$title) = @_;
- my ($lockhash,$tries,$gotlock,$id,$error);
-
- # get lock on ltitools db
- $lockhash = {
- lock => $env{'user.name'}.
- ':'.$env{'user.domain'},
- };
- $tries = 0;
- if ($context eq 'domain') {
- $gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom);
- } else {
- $gotlock = &Apache::lonnet::newput('ltitools',$lockhash,$cdom,$cnum);
- }
- while (($gotlock ne 'ok') && ($tries<10)) {
- $tries ++;
- sleep (0.1);
- if ($context eq 'domain') {
- $gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom);
- } else {
- $gotlock = &Apache::lonnet::newput('ltitools',$lockhash,$cdom,$cnum);
- }
- }
- if ($gotlock eq 'ok') {
- my %currids;
- if ($context eq 'domain') {
- %currids = &Apache::lonnet::dump_dom('ltitools',$cdom);
- } else {
- %currids = &Apache::lonnet::dump('ltitools',$cdom,$cnum);
- }
- if ($currids{'lock'}) {
- delete($currids{'lock'});
- if (keys(%currids)) {
- my @curr = sort { $a <=> $b } keys(%currids);
- if ($curr[-1] =~ /^\d+$/) {
- $id = 1 + $curr[-1];
- }
- } else {
- $id = 1;
- }
- if ($id) {
- if ($context eq 'domain') {
- unless (&Apache::lonnet::newput_dom('ltitools',{ $id => $title },$cdom) eq 'ok') {
- $error = 'nostore';
- }
- } else {
- unless (&Apache::lonnet::newput('ltitools',{ $id => $title },$cdom,$cnum) eq 'ok') {
- $error = 'nostore';
- }
- }
- } else {
- $error = 'nonumber';
- }
- }
- my $dellockoutcome;
- if ($context eq 'domain') {
- $dellockoutcome = &Apache::lonnet::del_dom('ltitools',['lock'],$cdom);
- } else {
- $dellockoutcome = &Apache::lonnet::del('ltitools',['lock'],$cdom,$cnum);
- }
- } else {
- $error = 'nolock';
- }
- return ($id,$error);
-}
-
sub process_ltitools_image {
my ($r,$context,$dom,$cnum,$confname,$caller,$itemid,$configuserok,$switch,$author_ok,$currimg) = @_;
my $filename = $env{'form.'.$caller.'.filename'};
@@ -2693,6 +2693,40 @@ sub store_changes {
unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts') || ($key eq 'extresource')) {
$displayval = $changes->{$item}{$key};
}
+ if (($item eq 'grading') && ($key eq 'grading')) {
+ if ($displayval eq 'standard') {
+ my $hidetotals;
+ if (exists($changes->{$item}{'hidetotals'})) {
+ if ($changes->{$item}{'hidetotals'} eq '') {
+ if (exists($values->{'hidetotals'})) {
+ push(@delkeys,'hidetotals');
+ }
+ } else {
+ $hidetotals = $changes->{$item}{'hidetotals'};
+ }
+ } elsif (exists($values->{'hidetotals'})) {
+ $hidetotals = $values->{'hidetotals'};
+ }
+ if ($hidetotals eq '') {
+ $displayval = &mt('standard with "hide course totals" set to "No"');
+ if (exists($values->{'hidetotals'})) {
+ push(@delkeys,'hidetotals');
+ }
+ } elsif ($hidetotals =~ /^([\w,]+)$/) {
+ my $secstr = $1;
+ my @secs = split(/,/,$secstr);
+ if (grep(/^all$/,@secs)) {
+ $displayval = &mt('standard with "hide course totals" set to "Yes" for all users');
+ $hidetotals = 'all';
+ } else {
+ $displayval = &mt('standard with "hide course totals" set to "Yes" for users in section(s): [_1]',join(', ',@secs));
+ }
+ $storehash{'hidetotals'} = $hidetotals;
+ }
+ } elsif (exists($values->{'hidetotals'})) {
+ push(@delkeys,'hidetotals');
+ }
+ }
if ($item eq 'feedback') {
if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {
$text = $prefs->{$item}->{'itemtext'}{$1.$2};
@@ -2701,14 +2735,14 @@ sub store_changes {
$displayname = &mt('Recipients of '.$text.' questions');
}
} elsif ($item eq 'discussion') {
- if ($key =~ /^p(lc|ch)\.roles\.denied/) {
+ if ($key =~ /^p(lc|ch|ac)\.roles\.denied/) {
$displayname = &mt("$text (role-based)");
if ($displayval ne '') {
my @roles = split(',',$displayval);
@roles = map { &Apache::lonnet::plaintext($_); } @roles;
$displayval = join(', ',@roles);
}
- } elsif ($key =~ /^p(lc|ch)\.users\.denied/) {
+ } elsif ($key =~ /^p(lc|ch|ac)\.users\.denied/) {
$displayname = &mt("$text (specific user(s))");
} else {
if ($key eq 'allow_discussion_post_editing') {
@@ -3120,7 +3154,7 @@ sub store_linkprot {
}
} elsif ($title eq 'returnurl') {
if ($values{$title}) {
- $display .= &mt('Return URL parameter').': '.$values{$title}.', ';
+ $display .= &mt('Return URL parameter').': '.$values{$title}.', ';
}
} elsif ($title eq 'passbackformat') {
if ($values{$title} eq '1.0') {
@@ -3286,7 +3320,13 @@ sub store_ltitools {
}
}
}
- $output .= ''.&mt('Configurable in course:');
+ $output .= '';
+ if ($context eq 'domain') {
+ $output .= &mt('Configurable in course');
+ } else {
+ $output .= &mt('Configurable for each instance of tool in course');
+ }
+ $output .= ':';
my @possconfig = ('label','title','target','linktext','explanation','append');
my $numconfig = 0;
if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') {
@@ -3552,7 +3592,7 @@ sub get_jscript {
$local_to_standard{$code_order[$i]} = $standardnames[$i];
}
foreach my $cloner (@cloners) {
- if (($cloner !~ /^\Q*:\E$match_domain$/) &&
+ if (($cloner !~ /^\Q*:\E$match_domain$/) &&
($cloner !~ /^$match_username\:$match_domain$/)) {
foreach my $item (split(/\&/,$cloner)) {
my ($key,$val) = split(/\=/,$item);
@@ -3653,7 +3693,7 @@ function syllabusinfo() {
}
}
ENDSCRIPT
- my $menuitems_js;
+ my ($menuitems_js,$grading_js);
unless ($noedit) {
my $collections;
my $next = 1;
@@ -3735,6 +3775,48 @@ function toggleAddmenucoll() {
}
}
ENDSCRIPT
+ $grading_js = <<"ENDSCRIPT";
+function toggleGrading(form) {
+ if (document.getElementById('hidetotalsdiv')) {
+ var totalsdivid = document.getElementById('hidetotalsdiv');
+ var selname = form.elements['grading'];
+ if (selname) {
+ var current = selname.options[selname.selectedIndex].value
+ if (current == 'standard') {
+ totalsdivid.style.display = 'inline-block';
+ } else {
+ totalsdivid.style.display = 'none';
+ }
+ }
+ }
+ return;
+}
+
+function toggleHiddenTotalsSec(form) {
+ if (document.getElementById('sectotalsdiv')) {
+ var sectotalsdivid = document.getElementById('sectotalsdiv');
+ var radioname = form.elements['hidetotals'];
+ if (radioname) {
+ if (radioname.length > 0) {
+ var setvis;
+ for (var i=0; i'."\n".
- '// '."\n".
+ $grading_js."\n".&linkprot_javascript()."\n".'//]]>'."\n".
''."\n".$stubrowse_js."\n".$ltitools_js."\n";
return $jscript;
}
@@ -3993,7 +4075,7 @@ sub print_courseinfo {
&mt('Modification may make assessment data inaccessible!').
'';
$editsyllabus = &mt('[_1]Edit[_2]','',
- '');
+ '');
}
my %items = (
'url' => {
@@ -4074,7 +4156,7 @@ sub print_courseinfo {
next if (!$env{'course.'.$env{'request.course.id'}.'.internal.uniquecode'});
}
unless (($item eq 'cloners') || ($item eq 'rolenames')) {
- $colspan = 2;
+ $colspan = 2;
}
$count ++;
if (exists $items{$item}{advanced} && $items{$item}{advanced} == 1) {
@@ -4257,12 +4339,12 @@ sub print_courseinfo {
if ($clonesrc =~ m{/$match_domain/$match_courseid}) {
my %clonesrcinfo = &Apache::lonnet::coursedescription($clonesrc);
if ($clonesrcinfo{'description'}) {
- $clonedfrom = $clonesrcinfo{'description'}.' '.($clonesrc);
+ $clonedfrom = $clonesrcinfo{'description'}.' '.($clonesrc);
}
}
$datatable .= $clonedfrom;
} elsif ($item eq 'uniquecode') {
- my $code = $env{'course.'.$env{'request.course.id'}.'.internal.uniquecode'};
+ my $code = $env{'course.'.$env{'request.course.id'}.'.internal.uniquecode'};
if ($code) {
$datatable .= $code;
}
@@ -4309,12 +4391,12 @@ sub print_courseinfo {
} elsif ($uploaded) {
$datatable .= &mt('Uploaded file');
} else {
- $datatable .= &mt('Standard template');
+ $datatable .= &mt('Standard template');
}
$datatable .= (' ' x 2).
&mt('[_1]View[_2]',
'',
- '');
+ '');
} elsif ($item eq 'loncaparev') {
my $loncaparev = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
my $showreqd;
@@ -4339,7 +4421,7 @@ sub new_cloners_dom_row {
my ($output,$checkedon,$checkedoff);
if ($newdom ne '') {
if ($num eq $default) {
- $checkedon = 'checked="checked" ';
+ $checkedon = 'checked="checked" ';
} else {
$checkedoff = 'checked="checked" ';
}
@@ -4490,7 +4572,7 @@ ENDSCRIPT
sub display_loncaparev_constraints {
my ($r,$navmap,$loncaparev,$crstype) = @_;
- my ($reqdmajor,$reqdminor);
+ my ($reqdmajor,$reqdminor);
my $cid = $env{'request.course.id'};
my $cdom = $env{'course.'.$cid.'.domain'};
my $cnum = $env{'course.'.$cid.'.num'};
@@ -4760,7 +4842,7 @@ sub display_loncaparev_constraints {
if (ref($fromblocks{$type}) eq 'HASH') {
foreach my $rev (keys(%{$fromblocks{$type}})) {
my ($major,$minor) = split(/\./,$rev);
- ($reqdmajor,$reqdminor) =
+ ($reqdmajor,$reqdminor) =
&Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
$output .= &Apache::loncommon::start_data_table_row().
''.$rev.' | '.$lt{$type}.' | ';
@@ -4847,7 +4929,7 @@ sub display_loncaparev_constraints {
&Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,
$reqdmajor,$reqdminor);
$checkedrev{$key} = 1;
- }
+ }
push(@{$byresponsetype{$symb}{$rev}},$key);
$allmaps{$enclosing_map} = 1;
}
@@ -5099,7 +5181,7 @@ sub show_contents_view {
sub releases_by_map {
my ($r,$bymap,$url,$scopeorder,$lt) = @_;
return unless ((ref($bymap) eq 'HASH') && (ref($scopeorder) eq 'ARRAY'));
- my $newrow = 0;
+ my $newrow = 0;
if (ref($bymap->{$url}) eq 'HASH') {
foreach my $rev (sort(keys(%{$bymap->{$url}}))) {
if ($newrow) {
@@ -5216,8 +5298,7 @@ sub update_releasereq {
}
$modified_courses = [];
}
- undef($registered_cleanup);
- return;
+ return OK;
}
sub show_autocoowners {
@@ -5420,7 +5501,7 @@ sub print_localization {
undef,$includeempty,$disabled);
} else {
if ($settings->{$item} eq '') {
- unless ($noedit) {
+ unless ($noedit) {
$datatable .= ' | '.
&Apache::loncommon::select_language('languages_0','',1);
}
@@ -5457,8 +5538,8 @@ sub print_localization {
&Apache::loncommon::select_language('languages_'.$num,'',1).
''.
' | '.&Apache::loncommon::end_data_table_row();
- }
- $datatable .= &Apache::loncommon::end_data_table().' ';
+ }
+ $datatable .= &Apache::loncommon::end_data_table().' ';
}
}
$datatable .= &item_table_row_end();
@@ -5632,7 +5713,7 @@ sub select_recipient {
}
sub select_sections {
- my ($item,$num,$sections,$selected,$noedit) = @_;
+ my ($item,$num,$sections,$selected,$noedit,$allval) = @_;
my ($output,@currsecs,$allsec,$disabled);
if (ref($selected) eq 'ARRAY') {
@currsecs = @{$selected};
@@ -5648,16 +5729,24 @@ sub select_sections {
my $mult;
if (@{$sections} > 1) {
$mult = ' multiple="multiple"';
+ my $size;
if (@{$sections} > 3) {
- $mult .= ' size="4"';
+ $size = 4;
+ } else {
+ $size = 1 + scalar(@{$sections});
}
+ $mult .= ' size="'.$size.'"';
+ }
+ my $name = $item.'_sections';
+ unless ($item eq 'hidetotals') {
+ $name .= '_'.$num;
}
- $output = ' '.
- '';
+ '';
foreach my $item ('label','title','target','linktext','explanation','append') {
$datatable .= ' '.
''.
- ' '.
+ ' '.
''.&mt('Parameter name').':'.
''.
' ';
@@ -7535,7 +7638,7 @@ sub print_linkprotection {
$onclickpassback.$checkedpassback{'no'}.$disabled.' />'.&mt('No').' '.
''.
- ' '.
+ '
'.
' '.&mt('Grade format').
''.(' 'x2).
@@ -7548,7 +7651,7 @@ sub print_linkprotection {
$onclickreturnurl.$checkedreturnurl{'no'}.$disabled.' />'.&mt('No').' '.
''.
- ' '.
+ ' '.
''.&mt('Parameter name').':'.
''.
' ';
@@ -7668,7 +7771,7 @@ sub print_extresource_row {
$config->{'options'},$selected,
$config->{'nullval'},
undef,undef,$onchange,$noedit,$id);
- my ($checked,$reusesty,$sizesty);
+ my ($checked,$reusesty,$sizesty);
if ($reuse) {
$checked = ' checked="checked"';
}
@@ -7772,7 +7875,7 @@ sub item_table_row_end {
}
sub yesno_radio {
- my ($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit) = @_;
+ my ($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit,$onclick,$reverse) = @_;
my $itemon = ' ';
my $itemoff = ' checked="checked" ';
if (($valueyes eq '') && ($valueno eq '')) {
@@ -7794,12 +7897,22 @@ sub yesno_radio {
my $disabled;
if ($noedit) {
$disabled = ' disabled="disabled"';
+ } elsif ($onclick) {
+ $onclick = ' onclick="'.$onclick.'"';
+ }
+ if ($reverse) {
+ return ' '.
+ '';
+ } else {
+ return ' '.
+ '';
}
- return ' '.
- '';
}
sub select_from_options {
@@ -7855,7 +7968,7 @@ sub select_from_options {
}
sub make_item_rows {
- my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller,$noedit) = @_;
+ my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller,$noedit,$cnum) = @_;
my $datatable;
if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
my $count = 0;
@@ -7918,16 +8031,65 @@ sub make_item_rows {
}
$datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit);
} elsif ($items->{$item}{input} eq 'selectbox') {
- my $id;
+ my ($id,$onchange);
if ($caller eq 'menuitems') {
$id = $item;
+ } elsif ($caller eq 'grading') {
+ if ($item eq 'grading') {
+ $onchange = ' onchange="javascript:toggleGrading(this.form);"';
+ $id = $item;
+ }
}
my $curr = $settings->{$item};
$datatable .=
&select_from_options($item,$items->{$item}{'order'},
$items->{$item}{'options'},$curr,
$items->{$item}{'nullval'},
- undef,undef,undef,$noedit,$id);
+ undef,undef,$onchange,$noedit,$id);
+ if ($item eq 'grading') {
+ my ($unsetdefault,$valueyes,$valueno,$sectionbox);
+ my $gradingsty = 'none';
+ my $gradingsecsty = 'none';
+ $unsetdefault = 0;
+ my (@selsec,@sections,%current);
+ if ($curr eq 'standard') {
+ $gradingsty = 'inline-block';
+ if (ref($settings) eq 'HASH') {
+ $current{'hidetotals'} = $settings->{'hidetotals'};
+ if ($settings->{'hidetotals'} =~ /^([\w,]+)$/) {
+ my $secstr = $1;
+ unless ($secstr eq 'all') {
+ @selsec = split(/,/,$secstr);
+ }
+ $current{'hidetotals'} = 1;
+ }
+ }
+ }
+ $valueyes = "1";
+ $valueno = "0";
+ my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
+ if (keys(%sections)) {
+ @sections = sort( { $a <=> $b } keys(%sections));
+ }
+ my $onclick = 'javascript:toggleHiddenTotalsSec(this.form);';
+ my $sectionbox = ' ';
+ my $reverse = 1;
+ if (@sections) {
+ $sectionbox .= ' ... '.&mt('hidden in sections').': '.
+ ' '.
+ &select_sections('hidetotals','',\@sections,\@selsec,$noedit,'all').
+ ' ';
+ }
+ $sectionbox .= ' ';
+ $datatable .= ' '.
+ ''.
+ ''.
+ &yesno_radio('hidetotals',\%current,$unsetdefault,$valueyes,$valueno,$noedit,
+ $onclick,$reverse).' '.
+ $sectionbox.
+ '';
+ }
} elsif ($items->{$item}{input} eq 'textbox') {
my $disabled;
if ($noedit) {
@@ -7962,7 +8124,7 @@ sub nothidepriv_row {
}
}
if ($settings->{'checkforpriv'}) {
- @checkdoms = split(/,/,$settings->{'checkforpriv'});
+ @checkdoms = split(/,/,$settings->{'checkforpriv'});
}
}
push(@checkdoms,$cdom);
@@ -7976,7 +8138,7 @@ sub nothidepriv_row {
if ($end == -1 || $start == -1) {
next;
}
- foreach my $dom (@checkdoms) {
+ foreach my $dom (@checkdoms) {
if (&Apache::lonnet::privileged($uname,$udom,\@checkdoms,['dc','su'])) {
unless (grep(/^\Q$user\E$/,@privusers)) {
push(@privusers,$user);
@@ -8052,7 +8214,7 @@ sub checkforpriv_row {
my $domdesc = &Apache::lonnet::domain($currdom,'description');
if ($domdesc eq '') {
$domdesc = $currdom;
- }
+ }
$datatable .=
&Apache::loncommon::start_data_table_row().
' '.
@@ -8064,13 +8226,13 @@ sub checkforpriv_row {
&mt('Delete').' | '.
&Apache::loncommon::end_data_table_row();
$num ++;
- unless (grep(/^\Q$currdom\E$/,@excdoms)) {
+ unless (grep(/^\Q$currdom\E$/,@excdoms)) {
push(@excdoms,$currdom);
}
}
}
if ((scalar(keys(%domains)) - scalar(@excdoms)) > 0) {
- $datatable .=
+ $datatable .=
&Apache::loncommon::start_data_table_row().
' '.
&mt('Additional domain:'). ' '.
@@ -8184,7 +8346,7 @@ ENDJS
}
}
my $pos = $currnum+1;
- unless ($noedit) {
+ unless ($noedit) {
$output .=
' | '.
''.
| |