--- loncom/homework/rankresponse.pm	2011/09/16 22:23:54	1.67
+++ loncom/homework/rankresponse.pm	2025/01/25 23:24:23	1.75
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # rank style response
 #
-# $Id: rankresponse.pm,v 1.67 2011/09/16 22:23:54 raeburn Exp $
+# $Id: rankresponse.pm,v 1.75 2025/01/25 23:24:23 raeburn Exp $
 # Copyright Michigan State University Board of Trustees
 #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
@@ -51,7 +51,8 @@ sub start_rankresponse {
 	$result=&Apache::response::meta_package_write('rankresponse');
     } elsif ($target eq 'edit' ) {
 	$result.=&Apache::edit::start_table($token)
-           .'<tr><td>'.&Apache::lonxml::description($token).'</td>'
+           .'<tr><td>'.&Apache::loncommon::insert_folding_button()
+           .&Apache::lonxml::description($token).'</td>'
            .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
            .&Apache::edit::deletelist($target,$token)
            .'</span></td>'
@@ -186,8 +187,11 @@ sub get_correct_order {
 
 sub displayanswers {
     my ($max,$randomize,$tol,@opt)=@_;
-    if (!defined(@{ $Apache::response::foilgroup{'names'} })) { return; }
-    my @names = @{ $Apache::response::foilgroup{'names'} };
+    my @names;
+    if (ref($Apache::response::foilgroup{'names'}) eq 'ARRAY') {
+        @names = @{ $Apache::response::foilgroup{'names'} };
+    }
+    return if (!@names);
     my @whichfoils = &whichfoils($max,$randomize);
     my @correctorder=&get_correct_order($tol,@whichfoils);
     my $result;
@@ -332,8 +336,11 @@ sub format_prior_answer {
     my %grading     =&Apache::lonnet::str2hash($other_data->[1]);
     my $output;
     foreach my $name (@{ $foil_order }) {
-	next if (!defined($lastresponse{$name}));
-	$output .= '<tr><td>'.$lastresponse{$name}.'</td></tr>';
+        if (defined($lastresponse{$name})) {
+            $output .= '<tr><td>'.&HTML::Entities::encode($lastresponse{$name},'<>&"').'</td></tr>';
+        } else {
+            $output .= '<tr><td>&nbsp;</td></tr>';
+        }
     }
     return if (!defined($output));
     $output =
@@ -355,7 +362,7 @@ sub displayfoils {
 	    my $text=$Apache::response::foilgroup{$name.'.text'};
 	    my $value=shift(@correctorder);
 	    if ($target eq 'web') {
-		$result.='<br /><b>'.$value.':</b> '.$text;
+		$result.='<div class="LC_rankfoil"><b>'.$value.':</b> '.$text.'</div>';
 	    } else {
 		$result.=' \strut\\\\\strut '.$value.':'.$text;
 	    }
@@ -374,8 +381,17 @@ sub displayfoils {
                 $newvariation = 1;
             }
         }
-        unless (((($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurvey') || ($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurveycred')) && (defined($env{'form.grade_symb'}))) || $newvariation) {
-            $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
+        unless ($newvariation) {
+            if ((($env{'form.grade_username'} eq '') && ($env{'form.grade_domain'} eq '')) ||
+                (($env{'form.grade_username'} eq $env{'user.name'}) &&
+                 ($env{'form.grade_domain'} eq $env{'user.domain'}))) {
+                $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
+            } else {
+                unless (($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurvey') ||
+                        ($Apache::lonhomework::history{"resource.$part.type"} eq 'anonsurveycred')) {
+                    $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
+                }
+            }
         }
 	my %lastresponse=&Apache::lonnet::str2hash($lastresponse); 
 	my @alp = splice @alphabet, 0, $#whichopt + 1;
@@ -392,9 +408,10 @@ sub displayfoils {
         }
         foreach my $name (@whichfoils) {
 	    my $lastopt=$lastresponse{$name};
+            my $text=$Apache::response::foilgroup{$name.'.text'};
 	    my $optionlist='';
 	    if ($target ne 'tex') {
-                $optionlist = "<option></option>\n";
+                $optionlist = "<option value=\"\"></option>\n";
             } 
             if ($target eq 'tex' && $env{'form.pdfFormFields'} eq 'yes') {
                 my $fieldname = $env{'request.symb'}.'&part_'.$Apache::inputtags::part.'&rankresponse'.'&HWVAL_'.$Apache::inputtags::response['-1'].':'.$temp;
@@ -404,39 +421,41 @@ sub displayfoils {
 	    foreach $option (@whichopt) {
 		if ($option eq $lastopt) {
 		    if ($target ne 'tex' ) {
-                        $optionlist.="<option selected=\"selected\">$option</option>\n";
+                        $optionlist.="<option value=\"$option\" selected=\"selected\">$option</option>\n";
                     } elsif ($target eq 'tex' && $env{'form.pdfFormFields'} eq 'yes') {
                         $optionlist .= &Apache::lonxml::print_pdf_add_combobox_option($option); 
                     }
 		} else {
 		    if ($target ne 'tex') {
-                        $optionlist.="<option>$option</option>\n";
+                        $optionlist.="<option value=\"$option\">$option</option>\n";
                     } elsif ($target eq 'tex' && $env{'form.pdfFormFields'} eq 'yes') {
                         $optionlist .= &Apache::lonxml::print_pdf_add_combobox_option($option); 
                     }
 		} 
 	    }
 	    if ($target ne 'tex' && $Apache::lonhomework::type ne 'exam') {
+                my $labeltext = &mt('Choose ranking for:').' '.$text;
 		$optionlist='<select onchange="javascript:setSubmittedPart(\''.
 		  $part.'\');" name="HWVAL_'.
-		    $Apache::inputtags::response[-1].':'.$temp.'">'.
+		    $Apache::inputtags::response[-1].':'.$temp.'" aria-label="'.$labeltext.'">'.
 		        $optionlist."</select>\n";
 	    } elsif ($env{'form.pdfFormFields'} eq 'yes') {
                 #do nothing
             } else {
 		$optionlist=' '.$temp.' '.$optionlist.' ';
 	    }
-	    my $text=$Apache::response::foilgroup{$name.'.text'};
 	    if ($target ne 'tex') {
+                $result .= '<div class="LC_rankfoil">';
 		if ($Apache::lonhomework::type ne 'exam') {
-		    $result.='<br />'.$optionlist.$text."\n";
+		    $result.=$optionlist.$text."\n";
 		} else {
-		    $result.='<br />'.$text."\n";
+		    $result.=$text."\n";
 		}
 		if ($Apache::lonhomework::type eq 'exam') {
 		    my @values=(1..scalar(@whichopt));
 		    $result.=&Apache::optionresponse::webbubbles(\@values,\@whichopt,$temp,$lastopt);
 		}
+                $result .= '</div>';
 	    } else {
 		if ($Apache::lonhomework::type eq 'exam') {
                     my $itemlabel;