--- loncom/interface/courseprefs.pm 2023/09/06 13:32:28 1.49.2.28.2.17 +++ loncom/interface/courseprefs.pm 2023/10/06 23:01:38 1.49.2.28.2.18 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.49.2.28.2.17 2023/09/06 13:32:28 raeburn Exp $ +# $Id: courseprefs.pm,v 1.49.2.28.2.18 2023/10/06 23:01:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -807,7 +807,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') { @@ -1499,6 +1499,33 @@ 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}; } @@ -2580,6 +2607,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}; @@ -3507,7 +3568,7 @@ function syllabusinfo() { } } ENDSCRIPT - my $menuitems_js; + my ($menuitems_js,$grading_js); unless ($noedit) { my $collections; my $next = 1; @@ -3589,6 +3650,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". + $grading_js."\n".&linkprot_javascript()."\n".'//]]>'."\n". ''."\n".$stubrowse_js."\n".$ltitools_js."\n"; return $jscript; } @@ -5347,7 +5450,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}; @@ -5363,16 +5466,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 $sec (@{$sections}) { my $is_sel; if ((@currsecs) && (grep(/^\Q$sec\E$/,@currsecs))) { - $is_sel = 'selected="selected"'; + $is_sel = ' selected="selected"'; } $output .= ''; } @@ -5834,7 +5945,7 @@ sub print_appearance { } sub print_grading { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; + my ($cdom,$cnum,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } @@ -5853,7 +5964,7 @@ sub print_grading { }, 'rndseed' => { text => ''.&mt($itemtext->{'rndseed'}).''. - ''.'
'. + '
'.'
'. &mt('Modifying this will make problems have different numbers and answers!'). '
', input => 'selectbox', @@ -5885,7 +5996,7 @@ sub print_grading { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading',$noedit); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading',$noedit,$cnum); } sub print_printouts { @@ -7335,7 +7446,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 '')) { @@ -7357,12 +7468,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 { @@ -7418,7 +7539,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; @@ -7477,16 +7598,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 .= '
'. + ''. + &mt('Hide Course Points Totals').''. + '
'. + &yesno_radio('hidetotals',\%current,$unsetdefault,$valueyes,$valueno,$noedit, + $onclick,$reverse).'
'. + $sectionbox. + '
'; + } } elsif ($items->{$item}{input} eq 'textbox') { my $disabled; if ($noedit) {