--- loncom/interface/courseprefs.pm 2023/06/03 02:29:57 1.122 +++ loncom/interface/courseprefs.pm 2023/12/13 22:12:17 1.128 @@ -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.128 2023/12/13 22:12:17 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', @@ -522,7 +522,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 +694,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); } } } @@ -820,7 +822,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 +1339,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 +1354,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 +1363,7 @@ sub process_changes { } if ($fontchange) { $changes->{$entry} = 1; - } + } } elsif ($entry eq 'nothideprivileged') { my @curr_nothide; my @new_nothide; @@ -1436,7 +1438,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 +1454,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 +1550,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 +1709,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 +1826,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 +1864,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 +1943,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 +2397,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 +2658,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}; @@ -3120,7 +3119,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') { @@ -3552,7 +3551,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 +3652,7 @@ function syllabusinfo() { } } ENDSCRIPT - my $menuitems_js; + my ($menuitems_js,$grading_js); unless ($noedit) { my $collections; my $next = 1; @@ -3735,6 +3734,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; } @@ -3993,7 +4034,7 @@ sub print_courseinfo { &mt('Modification may make assessment data inaccessible!'). ''; $editsyllabus = &mt('[_1]Edit[_2]','', - ''); + ''); } my %items = ( 'url' => { @@ -4074,7 +4115,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 +4298,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 +4350,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 +4380,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 +4531,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 +4801,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 +4888,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 +5140,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) { @@ -5420,7 +5461,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 +5498,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 +5673,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 +5689,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 .= ''; } @@ -5744,7 +5793,7 @@ sub print_discussion { my $colspan; if ($item eq 'allow_limited_html_in_feedback') { $colspan = 2; - } + } $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); if ($item eq 'plc.roles.denied') { $datatable .= ''. @@ -5789,7 +5838,7 @@ sub print_discussion { ''.&mt('font-size').''. ''.&mt('font-weight').''. ''.&mt('font-style').''. - ''.&mt('Other css').''. + ''.&mt('Other css').''. &Apache::loncommon::end_data_table_row(). &set_discussion_fonts($cdom,$cnum,$item,$settings,$noedit). &Apache::loncommon::end_data_table().'
'; @@ -5841,7 +5890,7 @@ sub role_checkboxes { my $count = 0; my $disabled; if ($noedit) { - $disabled = ' disabled="disabled"'; + $disabled = ' disabled="disabled"'; } foreach my $role (@roles) { my $checked = ''; @@ -5969,7 +6018,7 @@ sub set_discussion_fonts { sub discussion_vote_classes { my $classorder = ['twoplus','oneplus','zero','oneminus','twominus']; - my %classtitles = &Apache::lonlocal::texthash( + my %classtitles = &Apache::lonlocal::texthash( 'twoplus' => 'Two sigma above mean', 'oneplus' => 'One sigma above mean', 'zero' => 'Within one sigma of mean', @@ -6035,7 +6084,7 @@ sub print_classlists { 'defaultcredits' => { text => ''.&mt($itemtext->{'defaultcredits'}).'', }, - + 'nothideprivileged' => { text => ''.&mt($itemtext->{'nothideprivileged'}).'', input => 'checkbox', @@ -6141,7 +6190,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; } @@ -6161,7 +6210,7 @@ sub print_grading { }, 'rndseed' => { text => ''.&mt($itemtext->{'rndseed'}).''. - ''.'
'. + '
'. &mt('Modifying this will make problems have different numbers and answers!'). '', input => 'selectbox', @@ -6193,7 +6242,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 { @@ -7152,7 +7201,7 @@ sub menuitems_categories { shown => ['top','inline','foot','main'], text => ['name','role','crs','disc','fdbk'], links => ['pers','logo','menu','comm','roles','help','logout'], - list => ['about','prefs','port','wish','anno','rss'], + list => ['about','prefs','port','wish','anno','rss','srch','brse'], inline => ['cont','grades','chat','people','groups','resv','syll','feeds'], ); return (\@order,\%categories); @@ -7192,6 +7241,8 @@ sub menuitems_fields { wish => 'Stored Links', anno => 'Calendar', rss => 'RSS Feeds', + srch => 'Search Library', + brse => 'Browse Library', cont => 'Contents', grades => 'Grades', chat => 'Chat', @@ -7247,7 +7298,7 @@ sub menucollections_display { ''.$menutitles{$category}.''."\n"; if ($category eq 'text') { $output .= ''.&mt('Header Text').'

'; - } + } foreach my $field (@{$categories{$category}}) { if ($field eq 'disc') { $output .= '
'.&mt('Footer Text').'

'; @@ -7302,12 +7353,12 @@ sub print_linkprotection { } else { $dest = '/adm/courseprefs'; } - + my ($switchserver,$switchmessage); $switchserver = &check_switchserver($cdom,$cnum,$context,$dest); if ($switchserver) { if ($context eq 'domain') { - $switchmessage = &mt("submit from domain's primary library server: [_1].",$switchserver); + $switchmessage = &mt("submit from domain's primary library server: [_1].",$switchserver); } elsif ($crstype eq 'Community') { $switchmessage = &mt("submit from community's home server: [_1].",$switchserver); } else { @@ -7343,7 +7394,7 @@ sub print_linkprotection { %checkedpassback = ( 'no' => ' checked="checked"', 'yes' => '', - ); + ); %checkedpassbackfmt = ( '1p1' => ' checked="checked"', '1p0' => '', @@ -7369,7 +7420,7 @@ sub print_linkprotection { $checkedrequser{'no'} = ''; } $datatable .= '
'.$lt{'requ'}.''; - if ($values{'requser'}) { + if ($values{'requser'}) { $usersty = 'display:inline-block'; } } @@ -7668,7 +7719,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 +7823,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 +7845,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 +7916,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 +7979,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) { @@ -7962,7 +8072,7 @@ sub nothidepriv_row { } } if ($settings->{'checkforpriv'}) { - @checkdoms = split(/,/,$settings->{'checkforpriv'}); + @checkdoms = split(/,/,$settings->{'checkforpriv'}); } } push(@checkdoms,$cdom); @@ -7976,7 +8086,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 +8162,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 +8174,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 +8294,7 @@ ENDJS } } my $pos = $currnum+1; - unless ($noedit) { + unless ($noedit) { $output .= ''. ''.