--- loncom/interface/loncommon.pm	2025/03/01 17:20:16	1.1467
+++ loncom/interface/loncommon.pm	2025/03/19 15:18:59	1.1472
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1467 2025/03/01 17:20:16 raeburn Exp $
+# $Id: loncommon.pm,v 1.1472 2025/03/19 15:18:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -966,7 +966,9 @@ ENDSCRT
 
 sub select_timezone {
    my ($name,$selected,$onchange,$includeempty,$id,$disabled)=@_;
-   my $output='<select name="'.$name.'" '.$id.$onchange.$disabled.'>'."\n";
+   my $labeltext = &HTML::Entities::encode(&mt('Select Time Zone'));
+   my $output='<select name="'.$name.'" '.$id.$onchange.$disabled.
+              ' aria-label="'.$labeltext.'">'."\n";
    if ($includeempty) {
        $output .= '<option value=""';
        if (($selected eq '') || ($selected eq 'local')) {
@@ -1351,7 +1353,7 @@ sub help_open_topic {
     }
     $template.=' <a'.$target.' href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'
-              .' alt="'.&mt('Help: [_1]',$topic).'"'
+              .' alt="'.&mt('Help icon').'"'
               .' title="'.$title.'" style="vertical-align:middle;"'.$imgid 
               .' /></a>';
     if ($text ne "") {	
@@ -2798,7 +2800,7 @@ sub create_text_file {
 # ------------------------------------------
 
 sub domain_select {
-    my ($name,$value,$multiple,$incdoms,$excdoms)=@_;
+    my ($name,$value,$multiple,$incdoms,$excdoms,$id)=@_;
     my @possdoms;
     if (ref($incdoms) eq 'ARRAY') {
         @possdoms = @{$incdoms};
@@ -2819,10 +2821,10 @@ sub domain_select {
     if ($multiple) {
 	$domains{''}=&mt('Any domain');
 	$domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
-	return &multiple_select_form($name,$value,4,\%domains);
+	return &multiple_select_form($name,$value,4,\%domains,undef,$id);
     } else {
 	$domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
-	return &select_form($name,$value,\%domains);
+	return &select_form($name,$value,\%domains,'','',$id);
     }
 }
 
@@ -2834,7 +2836,7 @@ sub domain_select {
 
 =over 4
 
-=item * &multiple_select_form($name,$value,$size,$hash,$order)
+=item * &multiple_select_form($name,$value,$size,$hash,$order,$id)
 
 Returns a string containing a <select> element int multiple mode
 
@@ -2846,12 +2848,13 @@ Args:
   $hash - the elements should be 'option' => 'shown text'
           (shown text should already have been &mt())
   $order - (optional) array ref of the order to show the elements in
+  $id = (optional) id for <select> element
 
 =cut
 
 #-------------------------------------------
 sub multiple_select_form {
-    my ($name,$value,$size,$hash,$order)=@_;
+    my ($name,$value,$size,$hash,$order,$id)=@_;
     my %selected = map { $_ => 1 } ref($value)?@{$value}:($value);
     my $output='';
     if (! defined($size)) {
@@ -2860,7 +2863,10 @@ sub multiple_select_form {
             $size = scalar(keys(%$hash));
         }
     }
-    $output.="\n".'<select name="'.$name.'" size="'.$size.'" multiple="multiple">';
+    if ($id ne '') {
+        $id = ' id="'.$id.'"'; 
+    }
+    $output.="\n".'<select name="'.$name.'" size="'.$size.'" multiple="multiple"'.$id.'>';
     my @order;
     if (ref($order) eq 'ARRAY')  {
         @order = @{$order};
@@ -2884,7 +2890,7 @@ sub multiple_select_form {
 
 =pod
 
-=item * &select_form($defdom,$name,$hashref,$onchange,$readonly)
+=item * &select_form($defdom,$name,$hashref,$onchange,$readonly,$id,$aria_labelledby)
 
 Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select options from a ref to a hash containing:
@@ -2892,7 +2898,10 @@ option_name => displayed text. An option
 a javascript onchange item, e.g., onchange="this.form.submit();".
 An optional arg -- $readonly -- if true will cause the select form
 to be disabled, e.g., for the case where an instructor has a section-
-specific role, and is viewing/modifying parameters. 
+specific role, and is viewing/modifying parameters. An optional arg
+-- $id -- will be used as the id attribute of the select element. An
+optional arg -- $aria_labelledby -- will be included as the aria-labelledby
+attribute of the select element.
 
 See lonrights.pm for an example invocation and use.
 
@@ -2900,7 +2909,7 @@ See lonrights.pm for an example invocati
 
 #-------------------------------------------
 sub select_form {
-    my ($def,$name,$hashref,$onchange,$readonly) = @_;
+    my ($def,$name,$hashref,$onchange,$readonly,$id,$aria_labelledby) = @_;
     return unless (ref($hashref) eq 'HASH');
     if ($onchange) {
         $onchange = ' onchange="'.$onchange.'"';
@@ -2909,7 +2918,13 @@ sub select_form {
     if ($readonly) {
         $disabled = ' disabled="disabled"';
     }
-    my $selectform = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n";
+    if ($id ne '') {
+        $id = ' id="'.$id.'"';
+    }
+    if ($aria_labelledby ne '') {
+        $aria_labelledby = ' aria-labelledby="'.$aria_labelledby.'"';
+    }
+    my $selectform = "<select name=\"$name\" size=\"1\"$onchange$disabled$id$aria_labelledby>\n";
     my @keys;
     if (exists($hashref->{'select_form_order'})) {
 	@keys=@{$hashref->{'select_form_order'}};
@@ -2960,7 +2975,7 @@ sub display_filter {
     my $onchange = "javascript:toggleHistoryOptions(this,'containingphrase','$context',
                                                     '$secondid','$thirdid')";
     return '<span class="LC_nobreak"><label>'.&mt('Records: [_1]',
-			       &Apache::lonmeta::selectbox('show',$env{'form.show'},'',undef,
+			       &Apache::lonmeta::selectbox('show',$env{'form.show'},'','',undef,
 							   (&mt('all'),10,20,50,100,1000,10000))).
 	   '</label></span> <span class="LC_nobreak">'.
            &mt('Filter: [_1]',
@@ -3062,9 +3077,12 @@ sub gradeleveldescription {
 }
 
 sub select_level_form {
-    my ($deflevel,$name)=@_;
+    my ($deflevel,$name,$id)=@_;
+    if ($id ne '') {
+        $id = ' id="'.$id.'"';
+    }
     unless ($deflevel) { $deflevel=0; }
-    my $selectform = "<select name=\"$name\" size=\"1\">\n";
+    my $selectform = "<select name=\"$name\" size=\"1\"$id>\n";
     for (my $i=0; $i<=18; $i++) {
         $selectform.="<option value=\"$i\" ".
             ($i==$deflevel ? 'selected="selected" ' : '').
@@ -4859,9 +4877,10 @@ sub filemimetype {
 
 
 sub filecategoryselect {
-    my ($name,$value)=@_;
+    my ($name,$value,$id)=@_;
     return &select_form($value,$name,
-                        {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))});
+                        {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))},
+                        '','',$id);
 }
 
 =pod
@@ -7347,6 +7366,11 @@ form, .inline {
   font-size: 1.0em;
 }
 
+h1.LC_search_results {
+  font-size: 1.0em;
+  font-weight: normal;
+}
+
 .LC_menus_content.shown{
   display: block;
 }
@@ -7359,6 +7383,10 @@ form, .inline {
   text-align:right;
 }
 
+.LC_left {
+  text-align:left;
+}
+
 .LC_center {
   text-align:center;
 }
@@ -7506,9 +7534,10 @@ div.LC_confirm_box .LC_success img {
   padding: 4px;
 }
 
-table.LC_pastsubmission {
+.LC_pastsubmission {
   border: 1px solid black;
   margin: 2px;
+  padding: 2px;
 }
 
 table#LC_menubuttons {
@@ -7762,6 +7791,12 @@ table.LC_nested tr.LC_empty_row td {
 table.LC_caption {
 }
 
+caption.LC_caption_prefs {
+  font-weight: normal;
+  text-align: left;
+  padding-bottom: 0.8em;
+}
+
 table.LC_nested tr.LC_empty_row td {
   padding: 4ex
 }
@@ -7932,6 +7967,10 @@ table.LC_data_table tr > td.LC_roles_sel
   border-right: 8px solid #11CC55;
 }
 
+table.LC_data_table tr.LC_prefs_row {
+   line-height: 250%;
+}
+
 span.LC_current_location {
   font-size:larger;
   background: $pgbg;
@@ -8314,6 +8353,11 @@ div.LC_prob_status_inner {
   padding: 5px;
 }
 
+caption.LC_filesub_status {
+  text-align: left;
+  font-weight: bold;
+}
+
 .LC_mail_actions {
   float: left;
   padding: 0;
@@ -10963,8 +11007,8 @@ sub simple_error_page {
     }
 
     sub data_table_caption {
-        my $caption = shift;
-        return "<caption class=\"LC_caption\">$caption</caption>";
+        my ($caption,$css_class) = @_;
+        return "<caption class=\"LC_caption $css_class\">$caption</caption>";
     }
 }