Diff for /loncom/interface/statistics/lonstudentassessment.pm between versions 1.2 and 1.16

version 1.2, 2002/07/25 21:23:51 version 1.16, 2002/10/23 21:04:26
Line 6 Line 6
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).  # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
 #  
 # LON-CAPA is free software; you can redistribute it and/or modify  # LON-CAPA is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by  # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or  # the Free Software Foundation; either version 2 of the License, or
Line 42  use Apache::lonhtmlcommon; Line 41  use Apache::lonhtmlcommon;
 use Apache::loncoursedata;  use Apache::loncoursedata;
 use GDBM_File;  use GDBM_File;
   
   #my $jr;
   
 sub BuildStudentAssessmentPage {  sub BuildStudentAssessmentPage {
     my ($cacheDB,$students,$courseID,$formName,$headings,$spacing,      my ($cacheDB,$students,$courseID,$formName,$headings,$spacing,
         $studentInformation,$r,$c)=@_;          $studentInformation,$r,$c)=@_;
   #    $jr = $r;
     my %cache;      my %cache;
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {      unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
         $r->print('<html><body>Unable to tie database.</body></html>');          $r->print('<html><body>Unable to tie database.</body></html>');
         return;          return;
     }      }
   
       # Remove students who don't have the proper section.
       my @sectionsSelected = split(':',$cache{'sectionsSelected'});
       for(my $studentIndex=((scalar @$students)-1); $studentIndex>=0;
           $studentIndex--) {
           my $value = $cache{$students->[$studentIndex].':section'};
           my $found = 0;
           foreach (@sectionsSelected) {
               if($_ eq 'none') {
                   if($value eq '' || !defined($value) || $value eq ' ') {
                       $found = 1;
                       last;
                   }
               } else {
                   if($value eq $_) {
                       $found = 1;
                       last;
                   }
               }
           }
           if($found == 0) {
               splice(@$students, $studentIndex, 1);
           }
       }
       my ($infoHeadings, $infoKeys, $sequenceHeadings, $sequenceKeys,
           $doNotShow) = 
           &ShouldShowColumns(\%cache, $headings, $studentInformation);
   
     my $selectedName = &FindSelectedStudent(\%cache,       my $selectedName = &FindSelectedStudent(\%cache, 
                                             $cache{'StudentAssessmentStudent'},                                              $cache{'StudentAssessmentStudent'},
                                             $students);                                              $students);
     $r->print(&CreateInterface(\%cache, $selectedName, $students, $formName));      $r->print(&CreateInterface(\%cache, $selectedName, $students, $formName,
                                  $doNotShow));
       $r->rflush();
   
     my $Ptr = '';      my $Str = '';
     if($selectedName eq 'No Student Selected') {      if($selectedName eq 'No Student Selected') {
  $Ptr .= '<h3><font color=blue>WARNING: ';   $Str .= '<h3><font color=blue>WARNING: ';
         $Ptr .= 'Please select a student</font></h3>';          $Str .= 'Please select a student</font></h3>';
         $r->print($Ptr);          $r->print($Str);
         return;          return;
     }      }
   
     my ($infoHeadings, $infoKeys, $sequenceHeadings, $sequenceKeys) =   
         &ShouldShowColumns(\%cache, $headings, $studentInformation);  
   
     $r->print(&CreateTableHeadings(\%cache, $spacing, $infoKeys, $infoHeadings,      $r->print(&CreateTableHeadings(\%cache, $spacing, $infoKeys, $infoHeadings,
                                    $sequenceKeys, $sequenceHeadings));                                     $sequenceKeys, $sequenceHeadings));
     untie(%cache);      untie(%cache);
       if($c->aborted()) {  return $Str; }
   
     my $selected=0;      my $selected=0;
     $r->print('<pre>'."\n");      $r->print('<pre>'."\n");
     foreach (@$students) {      foreach (@$students) {
           if($c->aborted()) { return $Str; }
         next if ($_ ne $selectedName &&           next if ($_ ne $selectedName && 
                  $selectedName ne 'All Students');                   $selectedName ne 'All Students');
         $selected = 1;          $selected = 1;
         my $courseData;   
         if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {          my @who = ($_);
             if($cache{$_.':lastDownloadTime'} eq 'Not downloaded') {          next if(&Apache::loncoursedata::DownloadStudentCourseData(\@who, 'true', 
                 untie(%cache);                                                               $cacheDB, 'true', 
                 $courseData =                                                                'false', $courseID,
                     &Apache::loncoursedata::DownloadCourseInformation($_,                                                                $r, $c) ne 'OK');
                                                                       $courseID);          next if($c->aborted());
                 if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT,0640)) {  
                     &Apache::loncoursedata::ProcessStudentData(\%cache,           if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
                                                                $courseData, $_);              my @before=();
                     untie(%cache);              my @after=();
                 } else {              my @updateColumn=();
                     last if($c->aborted());              my $foundUpdate = 0;
               foreach(@$infoKeys) {
                   if(/updateTime/) {
                       $foundUpdate=1;
                       push(@updateColumn, $_);
                     next;                      next;
                 }                  }
             } else {                  if($foundUpdate) {
                 untie(%cache);                      push(@after, $_);
                   } else {
                       push(@before, $_);
                   }
             }              }
         } else {              my $displayString = 'DISPLAYDATA'.$spacing;
             last if($c->aborted());              $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(
             next;                                                           \%cache, $_,
         }                                                           \@before,
                                                            $displayString,
                                                            'preformatted'));
   
         last if ($c->aborted());              if($foundUpdate) {
                   $displayString = '';
                   $displayString .= '<a href="/adm/statistics?reportSelected=';
                   $displayString .= &Apache::lonnet::escape('Student Assessment');
                   $displayString .= '&download='.$_.'">';
                   $displayString .= 'DISPLAYDATA</a>'.$spacing;
                   $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(
                                                                      \%cache, $_,
                                                                      \@updateColumn,
                                                                      $displayString,
                                                                      'preformatted'));
               }
   
         if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) {              $displayString = 'DISPLAYDATA'.$spacing;
             my $displayString = 'DISPLAYDATA'.$spacing;  
             $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(              $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(
                                                          \%cache, $_,                                                           \%cache, $_,
                                                          $infoKeys,                                                           \@after,
                                                          $displayString,                                                           $displayString,
                                                          'preformatted'));                                                           'preformatted'));
             $r->print(&StudentReport(\%cache, $_, $spacing, $sequenceKeys));              $r->print(&StudentReport(\%cache, $_, $spacing, $sequenceKeys));
             $r->print("\n");              $r->print("\n");
               $r->rflush();
             untie(%cache);              untie(%cache);
         }          }
     }      }
   
   
       $r->print(&StudentReport(\%cache, "AvgTotal", $spacing, $sequenceKeys));
       $r->print("\n");
       $r->rflush();
       untie(%cache);
   
   
     $r->print('</pre>'."\n");      $r->print('</pre>'."\n");
     if($selected == 0) {      if($selected == 0) {
  $Ptr .= '<h3><font color=blue>WARNING: ';   $Str .= '<h3><font color=blue>WARNING: ';
         $Ptr .= 'Please select a student</font></h3>';          $Str .= 'Please select a student</font></h3>';
         $r->print($Ptr);          $r->print($Str);
     }      }
   
     return;      return;
Line 127  sub BuildStudentAssessmentPage { Line 185  sub BuildStudentAssessmentPage {
 #---- Student Assessment Web Page --------------------------------------------  #---- Student Assessment Web Page --------------------------------------------
   
 sub CreateInterface {  sub CreateInterface {
     my($cache,$selectedName,$students,$formName)=@_;      my($cache,$selectedName,$students,$formName,$doNotShow)=@_;
     my $Ptr = '';  
     $Ptr .= &CreateLegend();      my $Str = '';
     $Ptr .= '<table><tr><td>'."\n";      $Str .= &CreateLegend();
     $Ptr .= '<input type="submit" name="PreviousStudent" ';      $Str .= '<table><tr><td>'."\n";
     $Ptr .= 'value="Previous Student" />'."\n";      $Str .= '<input type="submit" name="PreviousStudent" ';
     $Ptr .= '&nbsp&nbsp&nbsp'."\n";      $Str .= 'value="Previous Student" />'."\n";
     $Ptr .= &Apache::lonhtmlcommon::StudentOptions($cache, $students,       $Str .= '&nbsp&nbsp&nbsp'."\n";
       $Str .= &Apache::lonhtmlcommon::StudentOptions($cache, $students, 
                                                    $selectedName,                                                      $selectedName, 
                                                    'StudentAssessment',                                                      'StudentAssessment', 
                                                    $formName);                                                     $formName);
     $Ptr .= "\n".'&nbsp&nbsp&nbsp'."\n";      $Str .= "\n".'&nbsp&nbsp&nbsp'."\n";
     $Ptr .= '<input type="submit" name="NextStudent" ';      $Str .= '<input type="submit" name="NextStudent" ';
     $Ptr .= 'value="Next Student" />'."\n";      $Str .= 'value="Next Student" />'."\n";
     $Ptr .= '</td></tr></table>'."\n";      $Str .= '</td></tr></table>'."\n";
       $Str .= '<table cellspacing="5"><tr>'."\n";
       $Str .= '<td align="center"><b>Select Sections</b>'."\n";
       $Str .= '</td>'."\n";
       $Str .= '<td align="center"><b>Select column to view:</b></td>'."\n";
       $Str .= '<td></td></tr>'."\n";
   
       $Str .= '<tr><td align="center">'."\n";
       my @sections = split(':',$cache->{'sectionList'});
       my @selectedSections = split(':',$cache->{'sectionsSelected'});
       $Str .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
                                                             \@selectedSections,
                                                             'Statistics');
       $Str .= '</td><td align="center">';
       $Str .= &CreateColumnSelectionBox($doNotShow);
       $Str .= '</td><td>'."\n";
       $Str .= '<input type="submit" name="DefaultColumns" ';
       $Str .= 'value="Default Column Display" />'."\n";
       $Str .= '</td></tr></table>'."\n";
   
     return $Ptr;      return $Str;
 }  }
   
 sub CreateTableHeadings {  sub CreateTableHeadings {
Line 151  sub CreateTableHeadings { Line 228  sub CreateTableHeadings {
        $sequenceHeadings)=@_;         $sequenceHeadings)=@_;
   
     my $Str = '';      my $Str = '';
     $Str .= '<br><table border="0" cellpadding="0" cellspacing="0"><tr>'."\n";      $Str .= '<table border="0" cellpadding="0" cellspacing="0">'."\n";
   
       $Str .= '<tr>'."\n";
       $Str .= &CreateColumnSelectors($infoHeadings, $sequenceHeadings,
                                      $sequenceKeys);
       $Str .= '<td></td></tr>'."\n";
   
       $Str .= '<tr>'."\n";
     my $displayString = '<td align="left"><pre><a href="/adm/statistics?';      my $displayString = '<td align="left"><pre><a href="/adm/statistics?';
     $displayString .= 'sort=LINKDATA">DISPLAYDATA</a>FORMATTING';      $displayString .= 'sort=LINKDATA">DISPLAYDATA</a>FORMATTING';
     $displayString .= $spacing.'</pre></td>'."\n";      $displayString .= $spacing.'</pre></td>'."\n";
Line 162  sub CreateTableHeadings { Line 245  sub CreateTableHeadings {
                                                    $displayString,                                                     $displayString,
                                                    'preformatted');                                                     'preformatted');
   
     $displayString  = '<td align="left"><pre>DISPLAYDATA'.$spacing;      $displayString  = '<td align="left"><pre>DISPLAYDATAFORMATTING'.$spacing;
     $displayString .= '</pre></td>'."\n";      $displayString .= '</pre></td>'."\n";
     $Str .= &Apache::lonhtmlcommon::CreateHeadings($cache,      $Str .= &Apache::lonhtmlcommon::CreateHeadings($cache,
                                                    $sequenceKeys,                                                     $sequenceKeys,
Line 213  sub StudentReport { Line 296  sub StudentReport {
     my ($username,$domain)=split(':',$name);      my ($username,$domain)=split(':',$name);
   
     my $Str = '';      my $Str = '';
       if(defined($cache->{$name.':error'})) {
           return $Str;
       }
     if($cache->{$name.':error'} =~ /course/) {      if($cache->{$name.':error'} =~ /course/) {
         $Str .= '<b><font color="blue">No course data for student </font>';          $Str .= '<b><font color="blue">No course data for student </font>';
         $Str .= '<font color="red">'.$username.'.</font></b><br>';          $Str .= '<font color="red">'.$username.'.</font></b><br>';
         return $Str;          return $Str;
     }      }
   
     my $Version;      my $hasVersion = 'false';
     my $problemsCorrect = 0;      my $hasFinalData = 'false';
     my $totalProblems   = 0;  
     my $problemsSolved  = 0;  
     my $numberOfParts   = 0;  
 #    foreach my $sequence (split(':', $cache->{'orderedSequences'})) {  
     foreach my $sequence (@$showSequences) {      foreach my $sequence (@$showSequences) {
           my $hasData = 'false';
         my $characterCount=0;          my $characterCount=0;
         foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {          foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {
             my $problem = $cache->{$problemID.':problem'};              my $problem = $cache->{$problemID.':problem'};
             my $LatestVersion = $cache->{$name.':version:'.$problem};  
   
             # Output dashes for all the parts of this problem if there  
             # is no version information about the current problem.  
             if(!$LatestVersion) {  
                 foreach my $part (split(/\:/,$cache->{$sequence.':'.  
                                                       $problemID.  
                                                       ':parts'})) {  
                     $Str .= ' ';  
                     $totalProblems++;  
                     $characterCount++;  
                 }  
                 next;  
             }  
   
             my %partData=undef;  
             # Initialize part data, display skips correctly  
             # Skip refers to when a student made no submissions on that  
             # part/problem.  
             foreach my $part (split(/\:/,$cache->{$sequence.':'.  
                                                   $problemID.  
                                                   ':parts'})) {  
                 $partData{$part.':tries'}=0;  
                 $partData{$part.':code'}=' ';  
             }  
   
             # Looping through all the versions of each part, starting with the  
             # oldest version.  Basically, it gets the most recent   
             # set of grade data for each part.  
     for(my $Version=1; $Version<=$LatestVersion; $Version++) {  
                 foreach my $part (split(/\:/,$cache->{$sequence.':'.  
                                                       $problemID.  
                                                       ':parts'})) {  
   
                     if(!defined($cache->{$name.":$Version:$problem".  
                                                ":resource.$part.solved"})) {  
                         # No grade for this submission, so skip  
                         next;  
                     }  
   
                     my $tries=0;  
                     my $code=' ';  
   
                     $tries = $cache->{$name.':'.$Version.':'.$problem.  
                                       ':resource.'.$part.'.tries'};  
                     $partData{$part.':tries'}=($tries) ? $tries : 0;  
   
                     my $val = $cache->{$name.':'.$Version.':'.$problem.  
                                        ':resource.'.$part.'.solved'};  
                     if    ($val eq 'correct_by_student')   {$code = '*';}   
                     elsif ($val eq 'correct_by_override')  {$code = '+';}  
                     elsif ($val eq 'incorrect_attempted')  {$code = '.';}   
                     elsif ($val eq 'incorrect_by_override'){$code = '-';}  
                     elsif ($val eq 'excused')              {$code = 'x';}  
                     elsif ($val eq 'ungraded_attempted')   {$code = '#';}  
                     else                                   {$code = ' ';}  
                     $partData{$part.':code'}=$code;  
                 }  
             }  
   
             # All grades (except for versionless parts) are displayed as links              # All grades (except for versionless parts) are displayed as links
             # to their submission record.  Loop through all the parts for the              # to their submission record.  Loop through all the parts for the
             # current problem in the correct order and prepare the output links              # current problem in the correct order and prepare the output links
             $Str .= '<a href="/adm/grades?symb=';  
             $Str .= &Apache::lonnet::escape($problem);  
             $Str .= '&student='.$username.'&domain='.$domain;  
             $Str .= '&command=submission">';   
             foreach(split(/\:/,$cache->{$sequence.':'.$problemID.              foreach(split(/\:/,$cache->{$sequence.':'.$problemID.
                                         ':parts'})) {                                          ':parts'})) {
                 if($partData{$_.':code'} eq '*') {                  if($cache->{$name.':'.$problemID.':NoVersion'} eq 'true' ||
                     $problemsCorrect++;                     $cache->{$name.':'.$problemID.':'.$_.':code'} eq ' ' ||
                     if (($partData{$_.':tries'}<10) &&                     $cache->{$name.':'.$problemID.':'.$_.':code'} eq '') {
                         ($partData{$_.':tries'} ne '')) {                      $Str .= ' ';
                         $partData{$_.':code'}=$partData{$_.':tries'};                      $characterCount++;
                     }                      next;
                 } elsif($partData{$_.':code'} eq '+') {  
                     $problemsCorrect++;  
                 }                  }
                   $hasVersion = 'true';
                 $Str .= $partData{$_.':code'};                  $hasData = 'true';
                 $characterCount++;                  $Str .= '<a href="/adm/grades?symb=';
                   $Str .= &Apache::lonnet::escape($problem);
                 if($partData{$_.':code'} ne 'x') {                  $Str .= '&student='.$username.'&domain='.$domain;
                     $totalProblems++;                  $Str .= '&command=submission">'; 
                   my $code = $cache->{$name.':'.$problemID.':'.$_.':code'};
                   my $tries = $cache->{$name.':'.$problemID.':'.$_.':tries'};
                   if($code eq '*' && $tries < 10 && $tries ne '') {
                       $code = $tries;
                 }                  }
                   $Str .= $code;
                   $Str .= '</a>';
                   $characterCount++;
             }              }
             $Str.='</a>';  
         }          }
   
         # Output the number of correct answers for the current sequence.          # Output the number of correct answers for the current sequence.
Line 325  sub StudentReport { Line 348  sub StudentReport {
         $spacesNeeded -= 3;          $spacesNeeded -= 3;
         $Str .= (' 'x$spacesNeeded);          $Str .= (' 'x$spacesNeeded);
   
  my $outputProblemsCorrect = sprintf( "%3d", $problemsCorrect );  #        my $outputProblemsCorrect = sprintf("%3d", $cache->{$name.':'.$sequence.
  $Str .= '<font color="#007700">'.$outputProblemsCorrect.'</font>';  #    ':problemsCorrect'});
  $problemsSolved += $problemsCorrect;  
  $problemsCorrect=0;  
   
    my $outputProblemsCorrect = sprintf("%2d/%2d", $cache->{$name.':'.$sequence.
                                               ':problemsCorrect'}, 
                                               $characterCount);
           if($hasData eq 'true') {
               $Str .= '<font color="#007700">'.$outputProblemsCorrect.'</font>';
               $hasFinalData = 'true';
           } else {
               $Str .= '<font color="#007700">     </font>';
           }
         $Str .= $spacing;          $Str .= $spacing;
     }      }
   
     # Output the total correct problems over the total number of problems.      # Output the total correct problems over the total number of problems.
     # I don't like this type of formatting, but it is a solution.  Need      # I don't like this type of formatting, but it is a solution.  Need
     # a way to dynamically determine the space requirements.      # a way to dynamically determine the space requirements.
     my $outputProblemsSolved = sprintf( "%4d", $problemsSolved );      my $outputProblemsSolved = sprintf("%4d", $cache->{$name.':problemsSolved'});
     my $outputTotalProblems  = sprintf( "%4d", $totalProblems );      my $outputTotalProblems  = sprintf("%4d", $cache->{$name.':totalProblems'});
     $Str .= '<font color="#000088">'.$outputProblemsSolved.      if($hasFinalData eq 'true') {
           $Str .= '<font color="#000088">'.$outputProblemsSolved.
     ' / '.$outputTotalProblems.'</font>';      ' / '.$outputTotalProblems.'</font>';
       } else {
           $Str .= '<font color="#000088">           </font>';
       }
   
       if($hasVersion eq 'false') {
           $Str = '<b><font color="blue">No course data.</font></b>';
       }
   
     return $Str;      return $Str;
 }  }
Line 356  problems. Line 394  problems.
   
 sub CreateLegend {  sub CreateLegend {
     my $Str = "<p><pre>".      my $Str = "<p><pre>".
               "1..9: correct by student in 1..9 tries\n".                "   1  correct by student in 1 try\n".
               "   *: correct by student in more than 9 tries\n".                "   7  correct by student in 7 tries\n".
       "   +: correct by override\n".                "   *  correct by student in more than 9 tries\n".
               "   -: incorrect by override\n".        "   +  correct by override\n".
       "   .: incorrect attempted\n".                "   -  incorrect by override\n".
       "   #: ungraded attempted\n".        "   .  incorrect attempted\n".
               "    : not attempted\n".        "   #  ungraded attempted\n".
       "   x: excused".                "      not attempted (blank field)\n".
         "   x  excused".
               "</pre><p>";                 "</pre><p>"; 
     return $Str;      return $Str;
 }  }
Line 398  which has a size of four. Line 437  which has a size of four.
 =cut  =cut
   
 sub CreateColumnSelectionBox {  sub CreateColumnSelectionBox {
     my ($CacheData,$headings)=@_;      my ($doNotShow)=@_;
   
     my $missing=0;      my $notThere = '';
     my $notThere='<tr><td align="right"><b>Select column to view:</b>';      $notThere .= '<select name="ReselectColumns" size="4" ';
     my $name;      $notThere .= 'multiple="true">'."\n";
     $notThere .= '<td align="left">';  
     $notThere .= '<select name="ChartReselect" size="4" multiple="true">'."\n";      for(my $index=0; $index<$doNotShow->{'count'}; $index++) {
           my $name = $doNotShow->{$index.':name'};
     for(my $index=0; $index<(scalar @$headings); $index++) {          $notThere .= '<option value="';
         if(&ShouldShowColumn($CacheData, 'ChartHeading'.$index)) {          $notThere .= $doNotShow->{$index.':id'}.'">';
             next;  
         }  
         $name = $headings->[$index];  
         $notThere .= '<option value="ChartHeading'.$index.'">';  
         $notThere .= $name.'</option>'."\n";          $notThere .= $name.'</option>'."\n";
         $missing++;  
     }      }
   
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {      $notThere .= '</select>';
         if(&ShouldShowColumn($CacheData, 'ChartSequence'.$sequence)) {  
             next;  
         }  
         $name = $CacheData->{$sequence.':title'};  
         $notThere .= '<option value="ChartSequence'.$sequence.'">';  
         $notThere .= $name.'</option>'."\n";  
         $missing++;  
     }  
   
     if($missing) {      return $notThere;
         $notThere .= '</select>';  
     } else {  
         $notThere='<tr><td>';  
     }  
   
     return $notThere.'</td></tr>';  
 }  }
   
 =pod  =pod
Line 462  for consistency of location over the col Line 482  for consistency of location over the col
 =cut  =cut
   
 sub CreateColumnSelectors {  sub CreateColumnSelectors {
     my ($headings)=@_;      my ($infoHeadings, $sequenceHeadings, $sequenceKeys)=@_;
 =pod  
     my $found=0;  
     my ($name, $length, $position);  
   
     my $present = '<tr>';      my $present = '';
     for(my $index=0; $index<(scalar @$headings); $index++) {      for(my $index=0; $index<(scalar @$infoHeadings); $index++) {
         $present .= '<td align="left">';          $present .= '<td align="left">';
         $present .= '<input type="checkbox" checked="on" ';          $present .= '<input type="checkbox" checked="on" ';
         $present .= 'name="ChartHeading'.$index.'" />';          $present .= 'name="HeadingColumn'.$infoHeadings->[$index].'" />';
         $present .= '</td>';          $present .= '</td>'."\n";
         $found++;  
     }      }
   
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {      for(my $index=0; $index<(scalar @$sequenceHeadings); $index++) {
         if(!&ShouldShowColumn($CacheData, 'ChartSequence'.$sequence)) {  
             next;  
         }  
         $present .= '<td align="left">';          $present .= '<td align="left">';
         $present .= '<input type="checkbox" checked="on" ';          $present .= '<input type="checkbox" checked="on" ';
         $present .= 'name="ChartSequence'.$sequence.'" />';          $present .= 'name="SequenceColumn'.$sequenceKeys->[$index].'" />';
         $present .= '</td>';          $present .= '</td>'."\n";
         $found++;  
     }      }
   
     if(!$found) {      return $present;
         $present = '';  
     }  
   
     return $present.'<td></td></tr></form>'."\n";;  
 =cut  
 }  }
   
 #---- END Student Assessment Web Page ----------------------------------------  #---- END Student Assessment Web Page ----------------------------------------
Line 501  sub CreateColumnSelectors { Line 508  sub CreateColumnSelectors {
   
 sub FindSelectedStudent {  sub FindSelectedStudent {
     my($cache, $selectedName, $students)=@_;      my($cache, $selectedName, $students)=@_;
     for(my $index=0;   
         ($selectedName ne 'All Students') && ($index<(scalar @$students));       if($selectedName eq 'All Students' || 
         $index++) {         $selectedName eq 'No Student Selected') {
           return $selectedName;
       }
   
       for(my $index=0; $index<(scalar @$students); $index++) {
         my $fullname = $cache->{$students->[$index].':fullname'};          my $fullname = $cache->{$students->[$index].':fullname'};
         if($fullname eq $selectedName) {          if($fullname eq $selectedName) {
             if($cache->{'StudentAssessmentMove'} eq 'next') {              if($cache->{'StudentAssessmentMove'} eq 'next') {
                 if($index == ((scalar @$students) - 1)) {                  if($index == ((scalar @$students) - 1)) {
                     $selectedName = $students->[0];                      $selectedName = $students->[0];
                       return $selectedName;
                 } else {                  } else {
                     $selectedName = $students->[$index+1];                      $selectedName = $students->[$index+1];
                       return $selectedName;
                 }                  }
             } elsif($cache->{'StudentAssessmentMove'} eq 'previous') {              } elsif($cache->{'StudentAssessmentMove'} eq 'previous') {
                 if($index == 0) {                  if($index == 0) {
                     $selectedName = $students->[-1];                      $selectedName = $students->[-1];
                       return $selectedName;
                 } else {                  } else {
                     $selectedName = $students->[$index-1];                      $selectedName = $students->[$index-1];
                       return $selectedName;
                 }                  }
             } else {              } else {
                 $selectedName = $students->[$index];                  $selectedName = $students->[$index];
                   return $selectedName;
             }              }
             last;              last;
         }          }
     }      }
   
     return $selectedName;      return 'No Student Selected';
 }  }
   
 =pod  =pod
Line 558  sub ShouldShowColumns { Line 574  sub ShouldShowColumns {
     my @sequenceKeys=();      my @sequenceKeys=();
     my @sequenceHeadings=();      my @sequenceHeadings=();
   
       my %doNotShow;
   
     my $index;      my $index;
       my $count = 0;
       my $check = '';
     for($index=0; $index < scalar @$headings; $index++) {      for($index=0; $index < scalar @$headings; $index++) {
         push(@infoHeadings, $headings->[$index]);          $check = 'HeadingColumn'.$headings->[$index];
         push(@infoKeys, $cacheKey->[$index]);          if($cache->{'HeadingsFound'} =~ /$check/) {
               push(@infoHeadings, $headings->[$index]);
               push(@infoKeys, $cacheKey->[$index]);
           } else {
               $doNotShow{$count.':name'} = $headings->[$index];
               $doNotShow{$count.':id'} = 'HeadingColumn'.$headings->[$index];
               $count++;
           }
     }      }
   
     foreach my $sequence (split(/\:/,$cache->{'orderedSequences'})) {      foreach my $sequence (split(/\:/,$cache->{'orderedSequences'})) {
         push(@sequenceHeadings, $cache->{$sequence.':title'});          $check = 'SequenceColumn'.$sequence;
         push(@sequenceKeys, $sequence);          if($cache->{'SequencesFound'} eq 'All Sequences' || 
              $cache->{'SequencesFound'} =~ /$check/) {
               push(@sequenceHeadings, $cache->{$sequence.':title'});
               push(@sequenceKeys, $sequence);
           } else {
               $doNotShow{$count.':name'} = $cache->{$sequence.':title'};
               $doNotShow{$count.':id'} = 'SequenceColumn'.$sequence;
               $count++;
           }
     }      }
   
 #    my $headings=$cache->{'form.ChartHeadings'};      $doNotShow{'count'} = $count;
 #    my $sequences=$cache->{'form.ChartSequences'};  
 #    if($headings eq 'ALLHEADINGS' || $sequences eq 'ALLSEQUENCES' ||  
 #       $headings=~/$test/ || $sequences=~/$test/) {  
 #        return 1;  
 #    }  
   
     return (\@infoHeadings, \@infoKeys, \@sequenceHeadings,       return (\@infoHeadings, \@infoKeys, \@sequenceHeadings, 
             \@sequenceKeys);              \@sequenceKeys, \%doNotShow);
 }  }
   
 #---- END Student Assessment Worker Functions --------------------------------  #---- END Student Assessment Worker Functions --------------------------------

Removed from v.1.2  
changed lines
  Added in v.1.16


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>