--- loncom/interface/lonstatistics.pm	2009/12/16 13:00:45	1.148
+++ loncom/interface/lonstatistics.pm	2020/11/10 19:28:32	1.165
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstatistics.pm,v 1.148 2009/12/16 13:00:45 bisitz Exp $
+# $Id: lonstatistics.pm,v 1.165 2020/11/10 19:28:32 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -64,6 +64,7 @@ use Apache::lonpercentage;
 use Apache::lonstudentsubmissions();
 use Apache::lonsurveyreports();
 use Apache::longradinganalysis();
+use Apache::lonquickgrades();
 use LONCAPA;
 
 #
@@ -365,7 +366,7 @@ sub section_or_group_text {
 
 sub get_students {
     if (! @Students) {
-        &PrepareClasslist()
+        &PrepareClasslist();
     }
     return @Students;
 }
@@ -405,25 +406,25 @@ sub StudentDataSelect {
     $Str .= 'size="'.$numvisible.'" >'."\n";
     #
     # Deal with 'all'
-    $Str .= '    <option value="all" ';
+    $Str .= '    <option value="all"';
     foreach (@SelectedStudentData) {
         if ($_ eq 'all') {
-            $Str .= 'selected ';
+            $Str .= ' selected="selected"';
             last;
         }
     }
-    $Str .= ">all</option>\n";
+    $Str .= '>'.&mt('all')."</option>\n";
     #
     # Loop through the student data fields
     foreach my $item (@StudentDataOrder) {
-        $Str .= '    <option value="'.$item.'" ';
+        $Str .= '    <option value="'.$item.'"';
         foreach (@SelectedStudentData) {
             if ($item eq $_ ) {
-                $Str .= 'selected ';
+                $Str .= ' selected="selected"';
                 last;
             }
         }
-        $Str .= '>'.$item."</option>\n";
+        $Str .= '>'.&mt($item)."</option>\n";
     }
     $Str .= "</select>\n";
     return $Str;
@@ -465,7 +466,7 @@ sub selected_sequences_with_assessments
 
     my @sequences_with_assessments;
     foreach my $sequence (@sequences) {
-	if ($navmap->hasResource($sequence,sub { shift->is_problem(); },0,1)){
+	if ($navmap->hasResource($sequence,sub { shift->is_gradable(); },0,1)){
             push(@sequences_with_assessments,$sequence);
         }
     }
@@ -506,11 +507,11 @@ sub map_select {
     $form .= 'size="'.$numvisible.'" >'."\n";
     #
     # Put in option for 'all'
-    $form .= '    <option value="all" ';
+    $form .= '    <option value="all"';
     if ($selected_maps[0] eq 'all') {
-        $form .= 'selected ';
+        $form .= ' selected="selected"';
     }
-    $form .= ">all</option>\n";
+    $form .= '>'.&mt('all').'</option>'."\n";
     #
     # Loop through the sequences
     my @sequences = &selected_sequences_with_assessments('all');
@@ -521,10 +522,10 @@ sub map_select {
         $navmap = shift(@sequences);
     }
     foreach my $seq (@sequences){
-        $form .= '    <option value="'.$seq->symb.'" ';
+        $form .= '    <option value="'.$seq->symb.'"';
         foreach (@selected_maps) {
             if ($seq->symb eq $_) {
-                $form .= 'selected ';
+                $form .= ' selected="selected"';
                 last;
             }
         }
@@ -546,6 +547,11 @@ sub SectionSelect {
         &PrepareClasslist()
     }
     #
+    # Make sure course's student table is up to date
+    if (@Sections) {
+        &Apache::loncoursedata::ensure_current_sections();
+    }
+    #
     # Build the form element
     my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';
@@ -556,10 +562,10 @@ sub SectionSelect {
     #
     # Loop through the sequences
     foreach my $s (@Sections) {
-        $Str .= '    <option value="'.$s.'" ';
+        $Str .= '    <option value="'.$s.'"';
         foreach (&get_selected_sections()) {
             if ($s eq $_) {
-                $Str .= 'selected ';
+                $Str .= ' selected="selected"';
                 last;
             }
         }
@@ -581,6 +587,14 @@ sub GroupSelect {
         &PrepareClasslist();
     }
     #
+    # Make sure course's groupnames and studentgroups tables
+    # are up to date.
+    #
+    if (@Groups) {
+        &Apache::loncoursedata::ensure_current_groups();
+        &Apache::loncoursedata::ensure_current_students_groups();
+    }
+    #
     # Build the form element
     my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';
@@ -591,10 +605,10 @@ sub GroupSelect {
     #
     # Loop through the groups
     foreach my $s (@Groups) {
-        $Str .= '    <option value="'.$s.'" ';
+        $Str .= '    <option value="'.$s.'"';
         foreach my $group (&get_selected_groups()) {
             if ($s eq $group) {
-                $Str .= 'selected ';
+                $Str .= ' selected="selected"';
                 last;
             }
         }
@@ -614,7 +628,7 @@ sub DisplayClasslist {
     # Output some of the standard interface components
     my $Str;
     $Str .= &Apache::lonhtmlcommon::breadcrumbs('Select One Student');
-    $Str .= '<p><table cellspacing="5">'."\n";
+    $Str .= '<table cellspacing="5">'."\n";
     $Str .= '<tr>';
     $Str .= '<th align="center"><b>'.&mt('Sections').'</b></th>';
     $Str .= '<th align="center"><b>'.&mt('Groups').'</b></th>';
@@ -632,7 +646,7 @@ sub DisplayClasslist {
         '</td>';
     
     $Str .= '</tr>'.$/;
-    $Str .= '</table></p>';
+    $Str .= '</table>';
     $Str .= '<input type="submit" name="selectstudent" value="'.
         &mt('Update Display').'" />';
     $r->print($Str);
@@ -690,13 +704,13 @@ sub DisplayClasslist {
     }
 
     $Str .= '<h2>'.&mt('Select One Student').'</h2>'
-           .'<p>'.&mt("Click on a student's name or username to view their chart").'</p>'
+           .'<p>'.&mt("Click on a student's name or username to view their chart.").'</p>'
            .&Apache::loncommon::start_data_table()
            .&Apache::loncommon::start_data_table_header_row();
     foreach my $field (@Fields) {
         $Str .= '<th><a href="/adm/statistics?'.
-            'reportSelected=student_assessment&'.
-            'selectstudent=1&'.
+            'reportSelected=student_assessment&amp;'.
+            'selectstudent=1&amp;'.
             'sort='.$field.'">'.&mt($field).
             '</a></th>';
     }
@@ -711,15 +725,19 @@ sub DisplayClasslist {
             if ($field eq 'fullname' || $field eq 'username') {
                 $Str .= '<a href="/adm/statistics?reportSelected=';
                 $Str .= &escape('student_assessment');
-                $Str .= '&sort='.&escape($env{'form.sort'});
-                $Str .= '&SelectedStudent=';
+                $Str .= '&amp;sort='.&escape($env{'form.sort'});
+                $Str .= '&amp;SelectedStudent=';
                 $Str .= &escape($sname).'">';
-                $Str .= $student->{$field}.'&nbsp;';
+                $Str .= $student->{$field};
                 $Str .= '</a>';
             } elsif ($field eq 'status') {
                 $Str .= &mt($student->{$field});
             } else {
-                $Str .= $student->{$field};
+                if ($student->{$field} eq 'none') {
+                    $Str .= &mt('none')
+                } else {
+                    $Str .= $student->{$field};
+                }
             }
             $Str .= '</td>';
         }
@@ -749,7 +767,7 @@ sub CreateMainMenu {
        
             {url => '/adm/statistics?reportSelected=problem_analysis',
 			 permission => 'F',
-             icon => 'edit-find.png',
+             icon => 'prob_ana.png',
              linktext => ('Detailed Problem Analysis'),
              linktitle => ('Detailed statistics and graphs of student performance on problems.')},
          ]},
@@ -777,7 +795,7 @@ sub CreateMainMenu {
                     
             {url => '/adm/statistics?reportSelected=survey_reports',
 			 permission => 'F',
-             icon => 'docs.png',
+             icon => 'survey_rep.png',
 			 linktext => ('Survey Reports'),
              linktitle => ('Prepare reports on survey results.')},
          ]});
@@ -792,14 +810,6 @@ sub handler {
     my $r=shift;
     my $c = $r->connection();
     #
-    # Check for overloading
-    my $loaderror=&Apache::lonnet::overloaderror($r);
-    if ($loaderror) { return $loaderror; }
-    $loaderror=
-       &Apache::lonnet::overloaderror($r,
-         $env{'course.'.$env{'request.course.id'}.'.home'});
-    if ($loaderror) { return $loaderror; }
-    #
     # Check for access
     if (! &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
         $env{'user.error.msg'}=
@@ -822,6 +832,8 @@ sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['sort','reportSelected',
                                              'SelectedStudent']);
+    my $GoToPage = $env{'form.reportSelected'};
+ 
     #
     # Give the LON-CAPA page header
     my $style = <<ENDSTYLE;
@@ -832,9 +844,38 @@ sub handler {
     td.essay          { border: 1px solid gray; }
 </style>
 ENDSTYLE
-      
+
+    my $head_extra = $style;
+    if (($env{'form.reportSelected'} eq 'student_submission_reports') &&
+        ($env{'form.renderprob'})) {
+        my @Symbs = &Apache::lonstathelpers::get_selected_symbs('problemchoice');
+        if (scalar(@Symbs) == 1) {
+            $head_extra .= &Apache::loncommon::css_links($Symbs[0]);
+        }
+    } elsif ($env{'form.reportSelected'} eq 'submissiontime_analysis') {
+        my ($navmap,$current_problem) =
+            &Apache::lonsubmissiontimeanalysis::get_current_problem();
+        if (ref($current_problem) eq 'HASH') {
+            my $symb = $current_problem->{'symb'};
+            if ($symb) {
+                $head_extra .= &Apache::loncommon::css_links($symb);
+            }
+        }
+    } elsif (($env{'form.reportSelected'} eq 'problem_analysis') &&
+              ($env{'form.show_prob'})) {
+        my $problem_types = &Apache::lonproblemanalysis::analyzable_types();
+        my ($navmap,$current_problem) =
+            &Apache::lonproblemanalysis::get_current_problem($problem_types);
+        if (ref($current_problem) eq 'HASH') {
+            my $symb = $current_problem->{'symb'};
+            my $res = $current_problem->{'resource'};
+            if ($symb) {
+                $head_extra .= &Apache::loncommon::css_links($symb);
+            }
+        }
+    }
     $r->print(&Apache::loncommon::start_page('Course Statistics and Charts',
-					     $style));
+					     $head_extra));
     $r->rflush();
     # 
     # Either print out a menu for them or send them to a report
@@ -844,17 +885,17 @@ ENDSTYLE
                                             text =>'Statistics',
                                             faq=>139,
                                             bug=>'Statistics and Charts'});
-    if (! exists($env{'form.reportSelected'}) || 
-        $env{'form.reportSelected'} eq '') {
-        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Statistics Main Page').
-                  &CreateMainMenu());
+    if ($GoToPage eq '') {
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Statistics Main Page'));
+        &Apache::lonquickgrades::startGradeScreen($r,'statistics');
+        $r->print(&CreateMainMenu());
     } else {
     #
         if (! &Apache::lonmysql::verify_sql_connection()) {
             my $serveradmin = $r->dir_config('lonAdmEMail');
-            $r->print('<h2 class="LC_error">'.
+            $r->print('<p class="LC_error">'.
                       &mt('Unable to connect to database!').
-                      '</h2>');
+                      '</p>');
             $r->print('<p>'
                      .&mt('Please notify the server administrator [_1]',
                          ,'<b>'.$serveradmin.'</b>')
@@ -870,18 +911,18 @@ ENDSTYLE
         #
         # Clean out the caches
         if (exists($env{'form.ClearCache'})) {
-            &Apache::loncoursedata::delete_caches($env{'requres.course.id'});
+            &Apache::loncoursedata::delete_caches($env{'request.course.id'});
         }
         #
         # Begin form output
         $r->print('<form name="Statistics" ');
+        if ($GoToPage eq 'student_submission_reports') {
+            $r->print('onsubmit="return checkanon();" ');
+        }
         $r->print('method="post" action="/adm/statistics">');
         $r->rflush();
-        #
-        my $GoToPage = $env{'form.reportSelected'};
-        #
         $r->print('<input type="hidden" name="reportSelected" value="'.
-                  $GoToPage.'">');
+                  $GoToPage.'" />');
         if($GoToPage eq 'activitylog') {
 #        &Apache::lonproblemstatistics::Activity();
         } elsif($GoToPage eq 'problem_statistics') {
@@ -932,6 +973,7 @@ ENDSTYLE
         #
         $r->print("</form>\n");
     }
+    &Apache::lonquickgrades::endGradeScreen($r);
     $r->print(&Apache::loncommon::end_page());
     $r->rflush();
     #