--- loncom/homework/grades.pm 2003/07/15 20:59:53 1.116 +++ loncom/homework/grades.pm 2003/07/18 20:14:35 1.119 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.116 2003/07/15 20:59:53 ng Exp $ +# $Id: grades.pm,v 1.119 2003/07/18 20:14:35 ng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,6 +106,7 @@ sub response_type { if (/^\w+response_\w+.*/) { my ($responsetype,$part) = split(/_/,$_,2); my ($partid,$respid) = split(/_/,$part); + $responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!! $handgrade{$part} = $responsetype.':'.($allkeys =~ /parameter_$part\_handgrade/ ? 'yes' : 'no'); next if ($seen{$partid} > 0); $seen{$partid}++; @@ -115,6 +116,83 @@ sub response_type { return \@partlist,\%handgrade; } +#--- Show resource title +#--- and parts and response type +sub showResourceInfo { + my ($url,$probTitle) = @_; + my $result ='<table border="0">'. + '<tr><td colspan=3><font size=+1><b>Current Resource: </b>'.$probTitle.'</font></td></tr>'."\n"; + my ($partlist,$handgrade) = &response_type($url); + my ($resptype,$hdgrade)=('','no'); + for (sort keys(%$handgrade)) { + my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_}); + $resptype = $responsetype; + $hdgrade = $handgrade if ($handgrade eq 'yes'); + $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'. + '<td><b>Type: </b>'.$responsetype.'</td></tr>'; +# '<td><b>Handgrade: </b>'.$handgrade.'</td></tr>'; + } + $result.='</table>'."\n"; + return $result,$resptype,$hdgrade,$partlist,$handgrade; +} + +#--- Clean response type for display +#--- Currently filters option response type only. +sub cleanRecord { + my ($answer,$response) = @_; + if ($response eq 'option') { + my (@IDs,@ans); + foreach (split(/\&/,&Apache::lonnet::unescape($answer))) { + my ($optionID,$ans) = split(/=/); + push @IDs,$optionID.'</font>'; + push @ans,$ans; + } + my $grayFont = '<font color="#999999">'; + return '<table border="1">'. + '<tr valign="top"><td>Answer</td><td>'. + (join '</td><td>',@ans).'</td></tr>'. + '<tr valign="top"><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont. + (join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'. + '</table>'; + } + return $answer; +} + +#-- A couple of common js functions +sub commonJSfunctions { + my $request = shift; + $request->print(<<COMMONJSFUNCTIONS); +<script type="text/javascript" language="javascript"> + function radioSelection(radioButton) { + var selection=null; + if (radioButton.length > 1) { + for (var i=0; i<radioButton.length; i++) { + if (radioButton[i].checked) { + return radioButton[i].value; + } + } + } else { + if (radioButton.checked) return radioButton.value; + } + return selection; + } + + function pullDownSelection(selectOne) { + var selection=""; + if (selectOne.length > 1) { + for (var i=0; i<selectOne.length; i++) { + if (selectOne[i].selected) { + return selectOne[i].value; + } + } + } else { + if (selectOne.selected) return selectOne.value; + } + } +</script> +COMMONJSFUNCTIONS +} + #--- Dumps the class list with usernames,list of sections, #--- section, ids and fullnames for each user. sub getclasslist { @@ -297,7 +375,7 @@ sub verifyreceipt { my $title.='<h3><font color="#339933">Verifying Submission Receipt '. $receipt.'</h3></font>'."\n". - '<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font><br><br>'."\n"; + '<font size=+1><b>Resource: </b>'.$ENV{'form.probTitle'}.'</font><br><br>'."\n"; my ($string,$contents,$matches) = ('','',0); my (undef,undef,$fullname) = &getclasslist('all','0'); @@ -345,26 +423,15 @@ sub listStudents { my $getsec = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'}; my $submitonly= $ENV{'form.submitonly'} eq '' ? 'all' : $ENV{'form.submitonly'}; - my $result; - my ($partlist,$handgrade) = &response_type($url); - for (sort keys(%$handgrade)) { - my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_}); - $ENV{'form.handgrade'} = 'yes' if ($handgrade eq 'yes'); - $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'. - '<td><b>Type: </b>'.$responsetype.'</td>'. - '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>'; - } - $result.='</table>'."\n"; - - my $viewgrade = $ENV{'form.handgrade'} eq 'yes' ? 'View/Grade' : 'View'; + my $viewgrade = $ENV{'form.showgrading'} eq 'yes' ? 'View/Grade/Regrade' : 'View'; $ENV{'form.probTitle'} = $ENV{'form.probTitle'} eq '' ? &Apache::lonnet::gettitle($symb) : $ENV{'form.probTitle'}; - $result='<h3><font color="#339933"> '. - $viewgrade. - ' Submissions for a Student or a Group of Students</font></h3>'. - '<table border="0"><tr><td colspan=3><font size=+1>'. - '<b>Problem: </b>'.$ENV{'form.probTitle'}.'</font></td></tr>'.$result; + my $result='<h3><font color="#339933"> '.$viewgrade. + ' Submissions for a Student or a Group of Students</font></h3>'; + + my ($table,$resptype,$hdgrade,$partlist,$handgrade) = &showResourceInfo($url,$ENV{'form.probTitle'}); + $result.=$table; $request->print(<<LISTJAVASCRIPT); <script type="text/javascript" language="javascript"> @@ -396,34 +463,21 @@ sub listStudents { formname.command.value = 'submission'; formname.submit(); } - - function pullDownSelection(selectOne) { - var selection=""; - if (selectOne.length > 1) { - for (var i=0; i<selectOne.length; i++) { - if (selectOne[i].selected) { - return selectOne[i].value; - } - } - } else { - if (selectOne.selected) return selectOne.value; - } - } </script> LISTJAVASCRIPT + &commonJSfunctions($request); $request->print($result); - my $checkhdgrade = $ENV{'form.handgrade'} eq 'yes' ? 'checked' : ''; - my $checklastsub = $ENV{'form.handgrade'} eq 'yes' ? '' : 'checked'; - + my $checkhdgrade = ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : ''; + my $checklastsub = $checkhdgrade eq '' ? 'checked' : ''; my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n". ' <b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n". '<input type="radio" name="vProb" value="yes" /> one student '."\n". '<input type="radio" name="vProb" value="all" /> all students <br />'."\n". ' <b>Submissions: </b>'."\n"; - if ($ENV{'form.handgrade'} eq 'yes') { - $gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> handgrade only'."\n"; + if ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { + $gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n"; } my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'}; @@ -654,8 +708,8 @@ sub sub_page_js { function checkSolved(formname,id) { if (eval("formname.solved"+id+".value") == "correct_by_student") { - alert("This problem has been graded correct by the computer. The score cannot be changed."); - return "noupdate"; + var reply = confirm("This problem has been graded correct by the computer. Do you want to change the score?"); + if (!reply) {return "noupdate";} } return "update"; } @@ -738,6 +792,7 @@ SUBJAVASCRIPT sub sub_page_kw_js { my $request = shift; my $iconpath = $request->dir_config('lonIconsURL'); + &commonJSfunctions($request); $request->print(<<SUBJAVASCRIPT); <script type="text/javascript" language="javascript"> @@ -818,7 +873,6 @@ sub sub_page_kw_js { return; } -// var pWin = null; function savedMsgHeader(Nmsg,usrctr,fullname) { var height = 70*Nmsg+250; var scrollbar = "no"; @@ -827,7 +881,12 @@ sub sub_page_kw_js { scrollbar = "yes"; } // if (window.pWin) {window.pWin.close(); window.pWin=null} - pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx=70,screeny=75,width=600,height='+height); + var xpos = (screen.width-600)/2; + xpos = (xpos < 0) ? '0' : xpos; + var ypos = (screen.height-height)/2-30; + ypos = (ypos < 0) ? '0' : ypos; + + pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height); pWin.focus(); pDoc = pWin.document; pDoc.write("<html><head>"); @@ -947,10 +1006,14 @@ sub sub_page_kw_js { return; } -// var hwdWin = null; function highlightCentral() { // if (window.hwdWin) window.hwdWin.close(); - hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx=100,screeny=75'); + var xpos = (screen.width-400)/2; + xpos = (xpos < 0) ? '0' : xpos; + var ypos = (screen.height-330)/2-30; + ypos = (ypos < 0) ? '0' : ypos; + + hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx='+xpos+',screeny='+ypos); hwdWin.focus(); var hDoc = hwdWin.document; hDoc.write("<html><head>"); @@ -958,9 +1021,9 @@ sub sub_page_kw_js { hDoc.write("<script language=javascript>"); hDoc.write("function updateChoice(flag) {"); - hDoc.write(" opener.document.SCORE.kwclr.value = radioSelection(document.hlCenter.kwdclr);"); - hDoc.write(" opener.document.SCORE.kwsize.value = radioSelection(document.hlCenter.kwdsize);"); - hDoc.write(" opener.document.SCORE.kwstyle.value = radioSelection(document.hlCenter.kwdstyle);"); + hDoc.write(" opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr);"); + hDoc.write(" opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize);"); + hDoc.write(" opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle);"); hDoc.write(" opener.document.SCORE.refresh.value = \\"on\\";"); hDoc.write(" if (opener.document.SCORE.keywords.value!=\\"\\"){"); hDoc.write(" opener.document.SCORE.submit();"); @@ -968,16 +1031,6 @@ sub sub_page_kw_js { hDoc.write(" self.close()"); hDoc.write("}"); - hDoc.write("function radioSelection(radioButton) {"); - hDoc.write(" var selection=null;"); - hDoc.write(" for (var i=0; i<radioButton.length; i++) {"); - hDoc.write(" if (radioButton[i].checked) {"); - hDoc.write(" selection=radioButton[i].value;"); - hDoc.write(" return selection;"); - hDoc.write(" }"); - hDoc.write(" }"); - hDoc.write("}"); - hDoc.write("<"); hDoc.write("/script>"); @@ -1125,12 +1178,20 @@ sub submission { # header info if ($counter == 0) { &sub_page_js($request); - &sub_page_kw_js($request); + &sub_page_kw_js($request) if ($ENV{'form.handgrade'} eq 'yes'); $ENV{'form.probTitle'} = $ENV{'form.probTitle'} eq '' ? &Apache::lonnet::gettitle($symb) : $ENV{'form.probTitle'}; $request->print('<h3> <font color="#339933">Submission Record</font></h3>'."\n". - '<font size=+1> <b>Problem: </b>'.$ENV{'form.probTitle'}.'</font>'."\n"); + '<font size=+1> <b>Resource: </b>'.$ENV{'form.probTitle'}.'</font>'."\n"); + + if ($ENV{'form.handgrade'} eq 'no') { + my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL'). + '/check.gif" height="16" border="0" />'; + my $checkMark='<br /><br /> <b>Note:</b> Part(s) graded correct by the computer is marked with a '. + $checkIcon.' symbol.'."\n"; + $request->print($checkMark); + } # option to display problem, only once else it cause problems # with the form later since the problem has a form. @@ -1141,7 +1202,7 @@ sub submission { # kwclr is the only variable that is guaranteed to be non blank # if this subroutine has been called once. my %keyhash = (); - if ($ENV{'form.kwclr'} eq '') { + if ($ENV{'form.kwclr'} eq '' && $ENV{'form.handgrade'} eq 'yes') { %keyhash = &Apache::lonnet::dump('nohist_handgrade', $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); @@ -1160,6 +1221,7 @@ sub submission { $request->print('<form action="/adm/grades" method="post" name="SCORE">'."\n". '<input type="hidden" name="command" value="handgrade" />'."\n". '<input type="hidden" name="saveState" value="'.$ENV{'form.saveState'}.'" />'."\n". + '<input type="hidden" name="Status" value="'.$ENV{'form.Status'}.'" />'."\n". '<input type="hidden" name="probTitle" value="'.$ENV{'form.probTitle'}.'" />'."\n". '<input type="hidden" name="refresh" value="off" />'."\n". '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". @@ -1229,11 +1291,10 @@ KEYWORDS $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}. '<font color="#999999"> Username: '.$uname. ($ENV{'user.domain'} eq $udom ? '' : ' ('.$udom.')').'</font><br />'."\n"; -# '<font color="#999999"> Domain: '.$udom.'</font><br />'."\n"; $result.='<input type="hidden" name="name'.$counter. '" value="'.$ENV{'form.fullname'}.'" />'."\n"; - # If this is an essay-response part(handgraded), then check for collaborators + # If any part of the problem is an essay-response (handgraded), then check for collaborators my @col_fullnames; my ($classlist,$fullname); if ($ENV{'form.handgrade'} eq 'yes') { @@ -1305,48 +1366,58 @@ KEYWORDS $$fullname{$ENV{'form.'.$uname.':'.$udom.':submitted_by'}}.'</a>'; $request->print($submitby); } else { - my ($string,$timestamp)= - &get_last_submission (%record); + my ($string,$timestamp)= &get_last_submission (\%record); my $lastsubonly=''. ($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '. - $$timestamp).''; + $$timestamp)."</td></tr>\n"; if ($$timestamp eq '') { - $lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0].'</td></tr>'."\n"; + $lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; } else { for my $part (sort keys(%$handgrade)) { - foreach (@$string) { - my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/; - if ($part eq ($partid.'_'.$respid)) { - my ($ressub,$subval) = split(/:/,$_,2); -# Similarity check - my $similar=''; - my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval); - if ($osim) { - $osim=int($osim*100.0); - $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim. - '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom). - '</font></h3><blockquote><i>'. - &keywords_highlight($oessay).'</i></blockquote><hr />'; - } - $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. - $partid.'</b> <font color="#999999">( ID '.$respid. - ' )</font> '. - ($record{"resource.$partid.$respid.uploadedurl"}? - '<a href="'. - &Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}). - '"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '. - '<font color="red" size="1">Like all files provided by users, '. - 'this file may contain virusses</font><br />':''). - '<b>Answer: </b><blockquote>'. - &keywords_highlight($subval).'</blockquote><br /> '.$similar.'</td></tr>'."\n" - if ($ENV{'form.lastSub'} eq 'lastonly' || - ($ENV{'form.lastSub'} eq 'hdgrade' && - $$handgrade{$part} =~ /:yes$/)); + my ($responsetype,$foo) = split(/:/,$$handgrade{$part}); + my ($partid,$respid) = split(/_/,$part); + if (!exists($record{'resource.'.$partid.'.'.$respid.'.submission'})) { + $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. + $partid.'</b> <font color="#999999">( ID '.$respid. + ' )</font> Nothing submitted<br /><br />'; + } else { + foreach (@$string) { + my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/; + if ($part eq ($partid.'_'.$respid)) { + my ($ressub,$subval) = split(/:/,$_,2); + # Similarity check + my $similar=''; + my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval); + if ($osim) { + $osim=int($osim*100.0); + $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim. + '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom). + '</font></h3><blockquote><i>'. + &keywords_highlight($oessay).'</i></blockquote><hr />'; + } + $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. + $partid.'</b> <font color="#999999">( ID '.$respid. + ' )</font> '. + ($record{"resource.$partid.$respid.uploadedurl"}? + '<a href="'. + &Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}). + '"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '. + '<font color="red" size="1">Like all files provided by users, '. + 'this file may contain virusses</font><br />':''). + '<b>Submitted Answer: </b>'.($responsetype =~ /^(essay|option)$/ ? + '<blockquote>' : ''). + &cleanRecord(&keywords_highlight($subval),$responsetype). + ($responsetype =~ /^(essay|option)$/ ? '</blockquote><br />' : + '<br /><br />').$similar."\n" + if ($ENV{'form.lastSub'} eq 'lastonly' || + ($ENV{'form.lastSub'} eq 'hdgrade' && + $$handgrade{$part} =~ /:yes$/)); + } } } } } - $lastsubonly.='</td></tr>'."\n"; + $lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n"; $request->print($lastsubonly); } } else { @@ -1357,8 +1428,7 @@ KEYWORDS } # return if view submission with no grading option -# if ($ENV{'form.showgrading'} eq '' || (!&canmodify($usec))) { - if (!&canmodify($usec)) { + if ($ENV{'form.showgrading'} eq '' || (!&canmodify($usec))) { $request->print('</td></tr></table></td></tr></table></form>'."\n"); $request->print(&show_grading_menu_form($symb,$url)) if (($ENV{'form.command'} eq 'submission') || @@ -1366,26 +1436,28 @@ KEYWORDS return; } - # Grading options $result='<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n". '<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n". '<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':' .$udom.'" />'."\n"; - my ($lastname,$givenn) = split(/,/,$ENV{'form.fullname'}); - my $msgfor = $givenn.' '.$lastname; - if (scalar(@col_fullnames) > 0) { - my $lastone = pop @col_fullnames; - $msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.'; - } - $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript - $result.='<tr><td bgcolor="#ffffff">'."\n". - ' <a href="javascript:msgCenter(document.SCORE,'.$counter. - ',\''.$msgfor.'\')"; TARGET=_self>'. - 'Compose Message to student'.(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> '. - '<img src="'.$request->dir_config('lonIconsURL'). - '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n". - '<br /> (Message will be sent when you click on Save & Next below.)'."\n" - if ($ENV{'form.handgrade'} eq 'yes'); + # essay grading options + if ($ENV{'form.handgrade'} eq 'yes') { + my ($lastname,$givenn) = split(/,/,$ENV{'form.fullname'}); + my $msgfor = $givenn.' '.$lastname; + if (scalar(@col_fullnames) > 0) { + my $lastone = pop @col_fullnames; + $msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.'; + } + $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript +# $result.='<tr><td bgcolor="#ffffff">'."\n". + $result.=' <a href="javascript:msgCenter(document.SCORE,'.$counter. + ',\''.$msgfor.'\')"; TARGET=_self>'. + 'Compose Message to student'.(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> '. + '<img src="'.$request->dir_config('lonIconsURL'). + '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n". + '<br /> (Message will be sent when you click on Save & Next below.)'."\n" + if ($ENV{'form.handgrade'} eq 'yes'); + } $request->print($result); my %seen = (); @@ -1394,7 +1466,7 @@ KEYWORDS my ($partid,$respid) = split(/_/); next if ($seen{$partid} > 0); $seen{$partid}++; -# next if ($$handgrade{$_} =~ /:no$/); + next if ($$handgrade{$_} =~ /:no$/ && $ENV{'form.lastSub'} =~ /^(hdgrade)$/); push @partlist,$partid; $request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); @@ -1413,26 +1485,21 @@ KEYWORDS if ($counter == $total) { my $endform='<table border="0"><tr><td>'. '<input type="hidden" name="gradeOpt" value="" />'."\n"; - if ($ENV{'form.handgrade'} eq 'yes') { - $endform.='<input type="button" value="Save & Next" '. - 'onClick="javascript:checksubmit(this.form,\'Save & Next\','. - $total.','.scalar(@partlist).');" TARGET=_self> '."\n"; - my $ntstu ='<select name="NTSTU">'. - '<option>1</option><option>2</option>'. - '<option>3</option><option>5</option>'. - '<option>7</option><option>10</option></select>'."\n"; - my $nsel = ($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1'); - $ntstu =~ s/<option>$nsel</<option selected="on">$nsel</; - $endform.=$ntstu.'student(s) '; - } else { - $endform.='<input type="hidden" name="NTSTU" value="1" />'."\n"; - } + $endform.='<input type="button" value="Save & Next" '. + 'onClick="javascript:checksubmit(this.form,\'Save & Next\','. + $total.','.scalar(@partlist).');" TARGET=_self> '."\n"; + my $ntstu ='<select name="NTSTU">'. + '<option>1</option><option>2</option>'. + '<option>3</option><option>5</option>'. + '<option>7</option><option>10</option></select>'."\n"; + my $nsel = ($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1'); + $ntstu =~ s/<option>$nsel</<option selected="on">$nsel</; + $endform.=$ntstu.'student(s) '; $endform.='<input type="button" value="Next" '. 'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> '."\n". '<input type="button" value="Previous" '. 'onClick="javascript:checksubmit(this.form,\'Previous\');" TARGET=_self> '; - $endform.='(Next and Previous do not save the scores.)'."\n" - if ($ENV{'form.handgrade'} eq 'yes'); + $endform.='(Next and Previous do not save the scores.)'."\n" ; $endform.='</td><tr></table></form>'; $endform.=&show_grading_menu_form($symb,$url); $request->print($endform); @@ -1442,15 +1509,15 @@ KEYWORDS #--- Retrieve the last submission for all the parts sub get_last_submission { - my (%returnhash)=@_; + my ($returnhash)=@_; my (@string,$timestamp); - if ($returnhash{'version'}) { + if ($$returnhash{'version'}) { my %lasthash=(); my ($version); - for ($version=1;$version<=$returnhash{'version'};$version++) { - foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) { - $lasthash{$_}=$returnhash{$version.':'.$_}; - $timestamp = scalar(localtime($returnhash{$version.':timestamp'})); + for ($version=1;$version<=$$returnhash{'version'};$version++) { + foreach (sort(split(/\:/,$$returnhash{$version.':keys'}))) { + $lasthash{$_}=$$returnhash{$version.':'.$_}; + $timestamp = scalar(localtime($$returnhash{$version.':timestamp'})); } } foreach ((keys %lasthash)) { @@ -1474,13 +1541,8 @@ sub keywords_highlight { (my $styleoff = $styleon) =~ s/\</\<\//; my @keylist = split(/[,\s+]/,$ENV{'form.keywords'}); foreach (@keylist) { - $string =~ s/\b\Q$_\E(\b|\.)/\<font color\=$ENV{'form.kwclr'} $size\>$styleon$_$styleoff\<\/font\>/gi; + $string =~ s/\b\Q$_\E(\b|\.)/<font color\=$ENV{'form.kwclr'} $size\>$styleon$_$styleoff<\/font>/gi; } - # This is not really the right place to do this, but I cannot find a - # better one at this time. So here we go - the m in the s:::mg causes - # ^ to match the beginning of a new line. So we replace(???) the beginning - # of the line with <br /> to make things formatted a little better. - $string =~ s:^:<br />:mg; return $string; } @@ -1526,7 +1588,8 @@ sub processHandGrade { if ($ENV{'form.collaborator'.$ctr}) { my (@collaborators) = split(/:/,$ENV{'form.collaborator'.$ctr}); foreach (@collaborators) { - my ($errorflag,$pts,$wgt) = &saveHandGrade($request,$url,$symb,$_,$udom,$ctr,$ENV{'form.unamedom'.$ctr}); + my ($errorflag,$pts,$wgt) = + &saveHandGrade($request,$url,$symb,$_,$udom,$ctr,$ENV{'form.unamedom'.$ctr}); if ($errorflag eq 'not_allowed') { $request->print("<font color=\"red\">Not allowed to modify grades for $_:$udom</font>"); next; @@ -1543,48 +1606,50 @@ sub processHandGrade { } } - # Keywords sorted in alphabatical order - my $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'}; - my %keyhash = (); - $ENV{'form.keywords'} =~ s/,\s{0,}|\s+/ /g; - $ENV{'form.keywords'} =~ s/^\s+|\s+$//; - my (@keywords) = sort(split(/\s+/,$ENV{'form.keywords'})); - $ENV{'form.keywords'} = join(' ',@keywords); - $keyhash{$symb.'_keywords'} = $ENV{'form.keywords'}; - $keyhash{$symb.'_subject'} = $ENV{'form.msgsub'}; - $keyhash{$loginuser.'_kwclr'} = $ENV{'form.kwclr'}; - $keyhash{$loginuser.'_kwsize'} = $ENV{'form.kwsize'}; - $keyhash{$loginuser.'_kwstyle'} = $ENV{'form.kwstyle'}; - - # message center - Order of message gets changed. Blank line is eliminated. - # New messages are saved in ENV for the next student. - # All messages are saved in nohist_handgrade.db - my ($ctr,$idx) = (1,1); - while ($ctr <= $ENV{'form.savemsgN'}) { - if ($ENV{'form.savemsg'.$ctr} ne '') { - $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.savemsg'.$ctr}; - $idx++; + if ($ENV{'form.handgrade'} eq 'yes') { + # Keywords sorted in alphabatical order + my $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'}; + my %keyhash = (); + $ENV{'form.keywords'} =~ s/,\s{0,}|\s+/ /g; + $ENV{'form.keywords'} =~ s/^\s+|\s+$//; + my (@keywords) = sort(split(/\s+/,$ENV{'form.keywords'})); + $ENV{'form.keywords'} = join(' ',@keywords); + $keyhash{$symb.'_keywords'} = $ENV{'form.keywords'}; + $keyhash{$symb.'_subject'} = $ENV{'form.msgsub'}; + $keyhash{$loginuser.'_kwclr'} = $ENV{'form.kwclr'}; + $keyhash{$loginuser.'_kwsize'} = $ENV{'form.kwsize'}; + $keyhash{$loginuser.'_kwstyle'} = $ENV{'form.kwstyle'}; + + # message center - Order of message gets changed. Blank line is eliminated. + # New messages are saved in ENV for the next student. + # All messages are saved in nohist_handgrade.db + my ($ctr,$idx) = (1,1); + while ($ctr <= $ENV{'form.savemsgN'}) { + if ($ENV{'form.savemsg'.$ctr} ne '') { + $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.savemsg'.$ctr}; + $idx++; + } + $ctr++; } - $ctr++; - } - $ctr = 0; - while ($ctr < $ngrade) { - if ($ENV{'form.newmsg'.$ctr} ne '') { - $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.newmsg'.$ctr}; - $ENV{'form.savemsg'.$idx} = $ENV{'form.newmsg'.$ctr}; - $idx++; + $ctr = 0; + while ($ctr < $ngrade) { + if ($ENV{'form.newmsg'.$ctr} ne '') { + $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.newmsg'.$ctr}; + $ENV{'form.savemsg'.$idx} = $ENV{'form.newmsg'.$ctr}; + $idx++; + } + $ctr++; } - $ctr++; + $ENV{'form.savemsgN'} = --$idx; + $keyhash{$symb.'_savemsgN'} = $ENV{'form.savemsgN'}; + my $putresult = &Apache::lonnet::put + ('nohist_handgrade',\%keyhash, + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); } - $ENV{'form.savemsgN'} = --$idx; - $keyhash{$symb.'_savemsgN'} = $ENV{'form.savemsgN'}; - my $putresult = &Apache::lonnet::put - ('nohist_handgrade',\%keyhash, - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); - # Called by Save & Refresh from Highlight Attribute Window - my (undef,undef,$fullname) = &getclasslist($ENV{'form.section'},'0'); +# my (undef,undef,$fullname) = &getclasslist($ENV{'form.section'},'0'); + my (undef,undef,$fullname) = &getclasslist($ENV{'form.section'},'1'); if ($ENV{'form.refresh'} eq 'on') { my ($ctr,$total) = (0,0); while ($ctr < $ngrade) { @@ -1606,7 +1671,7 @@ sub processHandGrade { # Get the next/previous one or group of students my $firststu = $ENV{'form.unamedom0'}; my $laststu = $ENV{'form.unamedom'.($ngrade-1)}; - $ctr = 2; + my $ctr = 2; while ($laststu eq '') { $laststu = $ENV{'form.unamedom'.($ngrade-$ctr)}; $ctr++; @@ -1690,6 +1755,7 @@ sub saveHandGrade { $wgt = $ENV{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 : $ENV{'form.WGT'.$newflg.'_'.$_}; my $partial= $pts/$wgt; + next if ($partial eq $record{'resource.'.$_.'.awarded'}); #do not update score for part if not changed. $newrecord{'resource.'.$_.'.awarded'} = $partial if ($record{'resource.'.$_.'.awarded'} ne $partial); my $reckey = 'resource.'.$_.'.solved'; @@ -1895,7 +1961,7 @@ sub viewgrades { my ($symb,$url) = ($ENV{'form.symb'},$ENV{'form.url'}); my $result='<h3><font color="#339933">Manual Grading</font></h3>'; - $result.='<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font>'."\n"; + $result.='<font size=+1><b>Current Resource: </b>'.$ENV{'form.probTitle'}.'</font>'."\n"; #view individual student submission form - called using Javascript viewOneStudent $result.=&jscriptNform($url,$symb); @@ -1964,8 +2030,6 @@ sub viewgrades { '<input type="hidden" name="totalparts" value="'.$ctsparts.'" />'; $result.='<input type="button" value="Reset" '. 'onClick="javascript:resetEntry('.$ctsparts.');" TARGET=_self>'; -# $result.=' <input type="button" value="Submit Changes" name="subButton1'. -# 'onClick="javascript:submit();" TARGET=_self />'."\n"; #table listing all the students in a section/class #header of table @@ -2076,7 +2140,7 @@ sub editgrades { my $symb=$ENV{'form.symb'}; my $url =$ENV{'form.url'}; my $title='<h3><font color="#339933">Current Grade Status</font></h3>'; - $title.='<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font><br />'."\n"; + $title.='<font size=+1><b>Current Resource: </b>'.$ENV{'form.probTitle'}.'</font><br />'."\n"; $title.='<font size=+1><b>Section: </b>'.$ENV{'form.section'}.'</font>'."\n"; my $result= '<table border="0"><tr><td bgcolor="#777777">'."\n"; $result.= '<table border="0"><tr bgcolor="#deffff">'. @@ -2314,19 +2378,8 @@ sub csvuploadmap_header { $javascript=&csvupload_javascript_forward_associate(); } - my $result='<table border="0">'; - $result.='<tr><td colspan=3><font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font></td></tr>'; - my ($partlist,$handgrade) = &response_type($url); - my ($resptype,$hdgrade)=('','no'); - for (sort keys(%$handgrade)) { - my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_}); - $resptype = $responsetype; - $hdgrade = $handgrade if ($handgrade eq 'yes'); - $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'. - '<td><b>Type: </b>'.$responsetype.'</td>'. - '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>'; - } - $result.='</table>'; + my ($result,$resptype,$hdgrade,$partlist,$handgrade) = &showResourceInfo($url,$ENV{'form.probTitle'}); + $request->print(<<ENDPICK); <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> <h3><font color="#339933">Uploading Class Grades</font></h3> @@ -2354,7 +2407,8 @@ to this page if the data selected is ins $javascript </script> ENDPICK -return ''; + $request->print(&show_grading_menu_form($symb,$url)); + return ''; } @@ -2400,9 +2454,11 @@ sub upcsvScores_form { </script> CSVFORMJS $ENV{'form.probTitle'} = &Apache::lonnet::gettitle($symb); + my ($table) = &showResourceInfo($url,$ENV{'form.probTitle'}); + $result.=$table; $result.='<br /><table width=100% border=0><tr><td bgcolor="#777777">'."\n"; $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n"; - $result.=' <b>Specify a file containing the class scores for problem - '.$ENV{'form.probTitle'}. + $result.=' <b>Specify a file containing the class scores for current resource'. '.</b></td></tr>'."\n"; $result.='<tr bgcolor=#ffffe6><td>'."\n"; my $upfile_select=&Apache::loncommon::upfile_select_html(); @@ -2421,7 +2477,6 @@ ENDUPFORM $result.='</td></tr></table>'."\n"; $result.='</td></tr></table><br /><br />'."\n"; $result.=&show_grading_menu_form($symb,$url); - return $result; } @@ -2555,35 +2610,9 @@ function checkPickOne(formname) { formname.submit(); } -function radioSelection(radioButton) { - var selection=null; - if (radioButton.length > 1) { - for (var i=0; i<radioButton.length; i++) { - if (radioButton[i].checked) { - return radioButton[i].value; - } - } - } else { - if (radioButton.checked) return radioButton.value; - } - return selection; -} - -function pullDownSelection(selectOne) { - var selection=""; - if (selectOne.length > 1) { - for (var i=0; i<selectOne.length; i++) { - if (selectOne[i].selected) { - return selectOne[i].value; - } - } - } else { - if (selectOne.selected) return selectOne.value; - } -} </script> LISTJAVASCRIPT - + &commonJSfunctions($request); my ($symb,$url) = &get_symb_and_url($request); my $cdom = $ENV{"course.$ENV{'request.course.id'}.domain"}; my $cnum = $ENV{"course.$ENV{'request.course.id'}.num"}; @@ -2624,7 +2653,7 @@ LISTJAVASCRIPT '<input type="radio" name="lastSub" value="all" /> all details'."\n"; $result.='<input type="hidden" name="section" value="'.$getsec.'" />'."\n". - '<input type="hidden" name="Status" value="'.$ENV{'form.Status'}.'" />'."\n". + '<input type="hidden" name="Status" value="'.$ENV{'form.Status'}.'" />'."\n". '<input type="hidden" name="command" value="displayPage" />'."\n". '<input type="hidden" name="url" value="'.$url.'" />'."\n". '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". @@ -2669,51 +2698,22 @@ LISTJAVASCRIPT sub getSymbMap { my ($request) = @_; my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db', - $ENV{'request.course.fn'}.'_parms.db',1, 1); + $ENV{'request.course.fn'}.'_parms.db'); $navmap->init(); - # End navmap using boilerplate - - my $iterator = Apache::lonnavmaps::iterator->new($navmap, undef, undef, undef, undef, 1, undef, 1); - my $depth = 1; - my $curRes = $iterator->next(); - my %symbx = (); my @titles = (); - my $minder=0; - my $seenBeginMap = 0; - while ($depth > 0 || !$seenBeginMap) { - if ($curRes == $iterator->BEGIN_MAP()) {$depth++; $seenBeginMap = 1; } - if ($curRes == $iterator->END_MAP()) { $depth--; } - - if (ref($curRes) && $curRes->is_map()) { - my ($mapUrl, $id, $resUrl) = split(/___/, $curRes->symb()); # check map contains at least one problem - my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps - - my $mapiterator = $navmap->getIterator($map->map_start(), - $map->map_finish()); - - my $mapdepth = 1; - my $countProblems = 0; - $mapiterator->next(); # skip the first BEGIN_MAP - my $mapcurRes = $mapiterator->next(); # for "current resource" - while ($mapdepth > 0) { - if($mapcurRes == $mapiterator->BEGIN_MAP) { $mapdepth++; } - if($mapcurRes == $mapiterator->END_MAP) { $mapdepth--; } - - if (ref($mapcurRes) && $mapcurRes->is_problem() && !$mapcurRes->randomout) { - $countProblems++; - } - $mapcurRes = $mapiterator->next(); - } - if ($countProblems > 0) { - my $title = $curRes->compTitle(); - push @titles,$minder.'.'.$title; # minder, just in case two titles are identical - $symbx{$minder.'.'.$title} = $curRes->symb(); - $minder++; - } - } - $curRes = $iterator->next(); + my $minder = 0; + + # Gather every sequence that has problems. + my @sequences = $navmap->retrieveResources(undef, sub { shift->is_map(); }, 1); + for my $sequence ($navmap->getById('0.0'), @sequences) { + if ($navmap->hasResource($sequence, sub { shift->is_problem(); }, 0) ) { + my $title = $minder.'.'.$sequence->compTitle(); + push @titles, $title; # minder in case two titles are identical + $symbx{$title} = $sequence->symb(); + $minder++; + } } $navmap->untieHashes(); @@ -2765,12 +2765,12 @@ sub displayPage { my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL'). '/check.gif" height="16" border="0" />'; - $studentTable.=' <b>Note:</b> A problem graded correct ('.$checkIcon. - ') by the computer cannot be changed.'."\n". + $studentTable.=' <b>Note:</b> Problems graded correct by the computer are marked with a '.$checkIcon. + ' symbol.'."\n". '<table border="0"><tr><td bgcolor="#777777">'. '<table border="0"><tr bgcolor="#e6ffff">'. - '<td align="center"><b> No </b></td>'. - '<td><b> '.($ENV{'form.vProb'} eq 'no' ? 'Title' : 'Problem View').'/Grade</b></td></tr>'; + '<td align="center"><b> Prob. </b></td>'. + '<td><b> '.($ENV{'form.vProb'} eq 'no' ? 'Title' : 'Problem Text').'/Grade</b></td></tr>'; my ($depth,$question) = (1,1); $iterator->next(); # skip the first BEGIN_MAP @@ -2805,42 +2805,11 @@ sub displayPage { if ($record{'version'} eq '') { $studentTable.='<br /> <font color="red">No recorded submission for this problem</font><br />'; } else { - $studentTable.='<table border="0" width="100%"><tr><td bgcolor="#777777">'. - '<table border="0" width="100%"><tr bgcolor="#e6ffff">'. - '<td><b>Date/Time</b></td>'. - '<td><b>Submission</b></td>'. - '<td><b>Status </b></td></tr>'; my %responseType = (); foreach my $partid (@{$parts}) { $responseType{$partid} = $curRes->responseType($partid); } - my ($version); - for ($version=1;$version<=$record{'version'};$version++) { - my $timestamp = scalar(localtime($record{$version.':timestamp'})); - $studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>'; - my @versionKeys = split(/\:/,$record{$version.':keys'}); - my @displaySub = (); - foreach my $partid (@{$parts}) { - my @matchKey = grep /^resource\.$partid\..*?\.submission$/,@versionKeys; - next if ($record{"$version:resource.$partid.solved"} eq ''); - $displaySub[0].=(exists $record{$version.':'.$matchKey[0]}) ? - '<b>Part '.$partid.' '. - ($record{"$version:resource.$partid.tries"} eq '' ? 'Trial not counted' : - 'Trial '.$record{"$version:resource.$partid.tries"}).'</b> '. - &cleanRecord($record{$version.':'.$matchKey[0]},$responseType{$partid}).'<br />' : ''; - $displaySub[1].=(exists $record{"$version:resource.$partid.award"}) ? - '<b>Part '.$partid.'</b> '. - $record{"$version:resource.$partid.award"}.'/'. - $record{"$version:resource.$partid.solved"}.'<br />' : ''; - $displaySub[2].=(exists $record{"$version:resource.$partid.regrader"}) ? - $record{"$version:resource.$partid.regrader"}.' (<b>Part:</b> '.$partid.')' : ''; - } - $displaySub[2].=(exists $record{"$version:resource.regrader"}) ? - $record{"$version:resource.regrader"} : ''; - $studentTable.='<td>'.$displaySub[0].' </td><td>'.$displaySub[1]. - ($displaySub[2] eq '' ? '' : 'Manually graded by '.$displaySub[2]).' </td></tr>'; - } - $studentTable.='</table></td></tr></table>'; + $studentTable.= &displaySubByDates(\%record,$parts,\%responseType,$checkIcon); } } elsif ($ENV{'form.lastSub'} eq 'all') { my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : ''); @@ -2874,24 +2843,44 @@ sub displayPage { return ''; } -sub cleanRecord { - my ($answer,$response) = @_; - if ($response eq 'option') { - my (@IDs,@ans); - foreach (split(/\&/,&Apache::lonnet::unescape($answer))) { - my ($optionID,$ans) = split(/=/); - push @IDs,$optionID.'</font>'; - push @ans,$ans; - } - my $grayFont = '<font color="#999999">'; - return '<table border="1">'. - '<tr valign="top"><td>Answer</td><td>'. - (join '</td><td>',@ans).'</td></tr>'. - '<tr><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont. - (join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'. - '</table>'; +sub displaySubByDates { + my ($record,$parts,$responseType,$checkIcon) = @_; + my $studentTable='<table border="0" width="100%"><tr><td bgcolor="#777777">'. + '<table border="0" width="100%"><tr bgcolor="#e6ffff">'. + '<td><b>Date/Time</b></td>'. + '<td><b>Submission</b></td>'. + '<td><b>Status </b></td></tr>'; + my ($version); + my %mark; + $mark{'correct_by_student'} = $checkIcon; + for ($version=1;$version<=$$record{'version'};$version++) { + my $timestamp = scalar(localtime($$record{$version.':timestamp'})); + $studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>'; + my @versionKeys = split(/\:/,$$record{$version.':keys'}); + my @displaySub = (); + foreach my $partid (@{$parts}) { + my @matchKey = grep /^resource\.$partid\..*?\.submission$/,@versionKeys; + next if ($$record{"$version:resource.$partid.solved"} eq ''); + $displaySub[0].=(exists $$record{$version.':'.$matchKey[0]}) ? + '<b>Part '.$partid.' '. + ($$record{"$version:resource.$partid.tries"} eq '' ? 'Trial not counted' : + 'Trial '.$$record{"$version:resource.$partid.tries"}).'</b> '. + &cleanRecord($$record{$version.':'.$matchKey[0]},$$responseType{$partid}).'<br />' : ''; + $displaySub[1].=(exists $$record{"$version:resource.$partid.award"}) ? + '<b>Part '.$partid.'</b> '. + lc($$record{"$version:resource.$partid.award"}).' '. + $mark{$$record{"$version:resource.$partid.solved"}}.'<br />' : ''; +# $$record{"$version:resource.$partid.solved"}.'<br />' : ''; + $displaySub[2].=(exists $$record{"$version:resource.$partid.regrader"}) ? + $$record{"$version:resource.$partid.regrader"}.' (<b>Part:</b> '.$partid.')' : ''; + } + $displaySub[2].=(exists $$record{"$version:resource.regrader"}) ? + $$record{"$version:resource.regrader"} : ''; + $studentTable.='<td>'.$displaySub[0].' </td><td>'.$displaySub[1]. + ($displaySub[2] eq '' ? '' : 'Manually graded by '.$displaySub[2]).' </td></tr>'; } - return $answer; + $studentTable.='</table></td></tr></table>'; + return $studentTable; } sub updateGradeByPage { @@ -3364,11 +3353,13 @@ sub gradingmenu { function checkChoice(formname,val,cmdx) { if (val <= 2) { var cmd = radioSelection(formname.radioChoice); + var cmdsave = cmd; } else { cmd = cmdx; + cmdsave = 'submission'; } formname.command.value = cmd; - formname.saveState.value = "saveCmd="+cmd+":saveSec="+pullDownSelection(formname.section)+ + formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+ ":saveSub="+radioSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status); if (val < 5) formname.submit(); if (val == 5) { @@ -3390,57 +3381,17 @@ sub gradingmenu { } return true; } - - function radioSelection(radioButton) { - var selection=null; - if (radioButton.length > 1) { - for (var i=0; i<radioButton.length; i++) { - if (radioButton[i].checked) { - return radioButton[i].value; - } - } - } else { - if (radioButton.checked) return radioButton.value; - } - return selection; - } - - function pullDownSelection(selectOne) { - var selection=""; - if (selectOne.length > 1) { - for (var i=0; i<selectOne.length; i++) { - if (selectOne[i].selected) { - return selectOne[i].value; - } - } - } else { - if (selectOne.selected) return selectOne.value; - } - } - </script> GRADINGMENUJS - - my $result='<h3> <font color="#339933">Manual Grading/View Submission</font></h3>'. - '<table border="0">'. - '<tr><td colspan=3><font size=+1><b>Problem: </b>'.$probTitle.'</font></td></tr>'."\n"; - my ($partlist,$handgrade) = &response_type($url); - my ($resptype,$hdgrade)=('','no'); - for (sort keys(%$handgrade)) { - my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_}); - $resptype = $responsetype; - $hdgrade = $handgrade if ($handgrade eq 'yes'); - $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'. - '<td><b>Type: </b>'.$responsetype.'</td></tr>'; -# '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>'; - } - $result.='</table>'."\n"; - + &commonJSfunctions($request); + my $result='<h3> <font color="#339933">Manual Grading/View Submission</font></h3>'; + my ($table,$resptype,$hdgrade) = &showResourceInfo($url,$probTitle); + $result.=$table; my (undef,$sections) = &getclasslist('all','0'); my $savedState = &savedState(); - my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'pickStudentPage' : $$savedState{'saveCmd'}); + my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'}); my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'}); - my $saveSub = ($$savedState{'saveSub'} eq '' ? 'yes' : $$savedState{'saveSub'}); + my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'}); my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'}); $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". @@ -3460,7 +3411,7 @@ GRADINGMENUJS $result.='<table width="100%" border=0>'; $result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n". - ' Section: <select name="section">'."\n"; + ' Select Section: <select name="section">'."\n"; if (ref($sections)) { foreach (sort (@$sections)) {$result.='<option value="'.$_.'" '. ($saveSec eq $_ ? 'selected="on"' : '').'>'.$_.'</option>'."\n";} @@ -3475,24 +3426,24 @@ GRADINGMENUJS } $result.='</td></tr>'; - $result.='<tr bgcolor="#ffffe6" valign="top"><td>'. - '<input type="radio" name="radioChoice" value="pickStudentPage" '. - ($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '. - 'One student for whole page/sequence/folder</td></tr>'."\n"; + $result.='<tr bgcolor="#ffffe6"valign="top"><td>'. + '<input type="radio" name="radioChoice" value="submission" '. + ($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students'. + '<br /> -->For students with '. + '<input type="radio" name="submitonly" value="yes" '. + ($saveSub eq 'yes' ? 'checked' : '').' /> submissions or '. + '<input type="radio" name="submitonly" value="all" '. + ($saveSub eq 'all' ? 'checked' : '').' /> for all</td></tr>'."\n"; $result.='<tr bgcolor="#ffffe6"valign="top"><td>'. '<input type="radio" name="radioChoice" value="viewgrades" '. ($saveCmd eq 'viewgrades' ? 'checked' : '').'> '. - 'All students in section/course for current resource</td></tr>'."\n"; + '<b>Current Resource:</b> For all students in selected section or course</td></tr>'."\n"; - $result.='<tr bgcolor="#ffffe6"valign="top"><td>'. - '<input type="radio" name="radioChoice" value="submission" '. - ($saveCmd eq 'submission' ? 'checked' : '').'> '.'One or more students for current resource'. - '<br /> -->For students who has: '. - '<input type="radio" name="submitonly" value="yes" '. - ($saveSub eq 'yes' ? 'checked' : '').' /> submitted'. - '<input type="radio" name="submitonly" value="all" '. - ($saveSub eq 'all' ? 'checked' : '').' /> everybody</td></tr>'."\n"; + $result.='<tr bgcolor="#ffffe6" valign="top"><td>'. + '<input type="radio" name="radioChoice" value="pickStudentPage" '. + ($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '. + 'The <b>complete</b> set/page/sequence: For one student</td></tr>'."\n"; $result.='<tr bgcolor="#ffffe6"><td><br />'. '<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="View/Grade/Regrade" />'.