[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm loncreateuser.pm lonuserutils.pm

raeburn raeburn at source.lon-capa.org
Mon Dec 15 14:17:39 EST 2025


raeburn		Mon Dec 15 19:17:39 2025 EDT

  Modified files:              
    /loncom/interface	loncommon.pm loncreateuser.pm lonuserutils.pm 
  Log:
  - WCAG 2 compliance.
    - Replace use of <table> with <div> for layout
    - Include labels for form elements
    - Include headers for tables
  
  
-------------- next part --------------
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1488 loncom/interface/loncommon.pm:1.1489
--- loncom/interface/loncommon.pm:1.1488	Sat Dec 13 05:56:01 2025
+++ loncom/interface/loncommon.pm	Mon Dec 15 19:17:39 2025
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1488 2025/12/13 05:56:01 raeburn Exp $
+# $Id: loncommon.pm,v 1.1489 2025/12/15 19:17:39 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1232,7 +1232,7 @@
 </script>
 END
     # output the initial values for the selection lists
-    $result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1${suffix}_changed();$onchangefirst\">\n";
+    $result .= "<select size=\"1\" name=\"$firstselectname\" id=\"$firstselectname\" onchange=\"select1${suffix}_changed();$onchangefirst\">\n";
     my @order = sort(keys(%{$hashref}));
     if (ref($menuorder) eq 'ARRAY') {
         @order = @{$menuorder};
@@ -1259,7 +1259,7 @@
     if ($onchangesecond) {
         $result .= ' onchange="'.$onchangesecond.'"';
     }
-    $result .= ">\n";
+    $result .= " id=\"$secondselectname\">\n";
     my $seconddefault = $hashref->{$firstdefault}->{'default'};
     
     my @secondorder = sort(keys(%select2));
@@ -1320,7 +1320,7 @@
 
     my $template = "";
     my $link;
-    
+    my $title = &mt('Online Help');
     $topic=~s/\W/\_/g;
 
     if (!$stayOnPage) {
@@ -1339,24 +1339,22 @@
              (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
         $target = '';
     }
+    $template = '<a'.$target.' href="'.$link.'" title="'.$title.'" class="LC_nounderline">';
     if ($text ne "") {
-	$template.='<span class="LC_help_open_topic">'
-                  .'<a'.$target.' href="'.$link.'">'
-                  .$text.'</a>';
+        $template = '<span class="LC_help_open_topic">'.$template.
+                    '<span class="LC_underline">'.$text.'</span> ';
     }
 
     # (Always) Add the graphic
-    my $title = &mt('Online Help');
     my $helpicon=&lonhttpdurl("/adm/help/help.png");
     if ($imgid ne '') {
         $imgid = ' id="'.$imgid.'"';
     }
-    $template.=' <a'.$target.' href="'.$link.'" title="'.$title.'">'
-              .'<img src="'.$helpicon.'" border="0"'
+    $template.=' <img src="'.$helpicon.'" border="0"'
               .' alt="'.&mt('Help icon').'"'
               .' title="'.$title.'" style="vertical-align:middle;"'.$imgid 
               .' /></a>';
-    if ($text ne "") {	
+    if ($text ne "") {
         $template.='</span>';
     }
     return $template;
@@ -3579,21 +3577,24 @@
                     'onclick="'.$jscall.'" onchange="'.$jscall.'"'.
                     $krbcheck.$disabled.' />';
     }
+    my $labeltext = &mt('Kerberos realm');
     if (($can_assign{'krb4'} && $can_assign{'krb5'}) ||
         ($can_assign{'krb4'} && !$can_assign{'krb5'} &&
          $in{'curr_authtype'} eq 'krb5') ||
         (!$can_assign{'krb4'} && $can_assign{'krb5'} &&
          $in{'curr_authtype'} eq 'krb4')) {
+        my $kerbtext = &mt('Choose Kerberos version');
         $result .= &mt
         ('[_1] Kerberos authenticated with domain [_2] '.
          '[_3] Version 4 [_4] Version 5 [_5]',
          '<label>'.$authtype,
          '</label><input type="text" size="10" name="krbarg" '.
              'value="'.$krbarg.'" '.
-             'onchange="'.$jscall.'"'.$disabled.' />',
+             'onchange="'.$jscall.'"'.$disabled.' aria-label="'.$labeltext.'" />',
+         '<fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.$kerbtext.'</legend>'.
          '<label><input type="radio" name="krbver" value="4" '.$check4.$disabled.' />',
          '</label><label><input type="radio" name="krbver" value="5" '.$check5.$disabled.' />',
-	 '</label>');
+	 '</label></fieldset>');
     } elsif ($can_assign{'krb4'}) {
         $result .= &mt
         ('[_1] Kerberos authenticated with domain [_2] '.
@@ -3601,7 +3602,7 @@
          '<label>'.$authtype,
          '</label><input type="text" size="10" name="krbarg" '.
              'value="'.$krbarg.'" '.
-             'onchange="'.$jscall.'"'.$disabled.' />',
+             'onchange="'.$jscall.'"'.$disabled.' aria-label="'.$labeltext.'" />',
          '<label><input type="hidden" name="krbver" value="4" />',
          '</label>');
     } elsif ($can_assign{'krb5'}) {
@@ -3611,7 +3612,7 @@
          '<label>'.$authtype,
          '</label><input type="text" size="10" name="krbarg" '.
              'value="'.$krbarg.'" '.
-             'onchange="'.$jscall.'"'.$disabled.' />',
+             'onchange="'.$jscall.'"'.$disabled.' aria-label="'.$labeltext.'" />',
          '<label><input type="hidden" name="krbver" value="5" />',
          '</label>');
     }
@@ -3667,8 +3668,9 @@
         $authtype = '<input type="radio" name="login" value="int" '.$intcheck.
                     ' onchange="'.$jscall.'" onclick="'.$jscall.'"'.$disabled.' />';
     }
+    my $labeltext = &mt('initial password');
     $autharg = '<input type="password" size="10" name="intarg" value="'.
-               $intarg.'" onchange="'.$jscall.'"'.$disabled.' />';
+               $intarg.'" onchange="'.$jscall.'"'.$disabled.' aria-label="'.$labeltext.'" />';
     $result = &mt
         ('[_1] Internally authenticated (with initial password [_2])',
          '<label>'.$authtype,'</label>'.$autharg);
@@ -3726,8 +3728,9 @@
                     $loccheck.' onchange="'.$jscall.'" onclick="'.
                     $jscall.'"'.$disabled.' />';
     }
+    my $labeltext = &mt('local authentication argument');
     $autharg = '<input type="text" size="10" name="locarg" value="'.
-               $locarg.'" onchange="'.$jscall.'"'.$disabled.' />';
+               $locarg.'" onchange="'.$jscall.'"'.$disabled.' aria-label="'.$labeltext.'" />';
     $result = &mt('[_1] Local Authentication with argument [_2]',
                   '<label>'.$authtype,'</label>'.$autharg);
     return $result;
@@ -7157,7 +7160,8 @@
         #don't show menus for public users
         if (!$public){
             unless ($args->{'no_inline_menu'}) {
-                $bodytag .= '<div class="LC_landmark" role="navigation" aria-label="Secondary Links">'.
+                my $labeltext = &HTML::Entities::encode(&mt('Secondary links'));
+                $bodytag .= '<div class="LC_landmark" role="navigation" aria-label="'.$labeltext.'">'.
                             Apache::lonmenu::secondary_menu($httphost,$ltiscope,$ltimenu,
                                                             $args->{'no_primary_menu'},
                                                             $menucoll,$menuref,
@@ -7898,11 +7902,25 @@
   background: $tabbg;
 }
 
+th.LC_zero_height,
 td.LC_zero_height {
   line-height: 0; 
   cellpadding: 0;
 }
 
+div.LC_grid {
+  display: table;
+}
+
+div.LC_grid_row {
+  display: table-row;
+}
+
+div.LC_grid_cell {
+  display: table-cell;
+  padding: 2px 4px 2px 4px;
+}
+
 table.LC_data_table {
   border: 1px solid #000000;
   border-collapse: separate;
@@ -8059,6 +8077,7 @@
 }
 
 table.LC_createuser {
+  padding: 0;
 }
 
 table.LC_createuser tr.LC_section_row td {
@@ -8918,6 +8937,14 @@
   border: 0;
 }
 
+.LC_nounderline {
+  text-decoration: none;
+}
+
+.LC_underline {
+  text-decoration: underline;
+}
+
 .LC_FormSectionClearButton input {
   background-color:transparent;
   border: none;
@@ -8955,10 +8982,18 @@
   padding: 4px;
 }
 
-fieldset.LC_grace {
+fieldset.LC_grace,
+fieldset#LC_additionalrecips {
   display:inline;
 }
 
+fieldset.LC_borderless {
+  display:inline;
+  border: 0;
+  padding: 0;
+  margin: 0;
+}
+
 fieldset.LC_delete_slot > legend,
 fieldset.LC_grace > legend {
   font-weight: normal;
@@ -12177,6 +12212,10 @@
                     'exact'     => 'is',
                     'contains'  => 'contains',
                     'begins'    => 'begins with',
+                    'srchterm'  => 'search term value',
+                    'srchin'    => 'search extent',
+                    'srchscope' => 'search match scope',
+                    'srchfield' => 'search field',
                                        );
     my %js_lt=&Apache::lonlocal::texthash(
                     'youm'      => "You must include some text to search for.",
@@ -12194,7 +12233,7 @@
     my $allow_blank = 1;
     if ($fixeddom) {
         $allow_blank = 0;
-        $domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,[$currdom]);
+        $domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,[$currdom],undef,'','srchdomain');
     } else {
         my $defdom = $env{'request.role.domain'};
         my ($trusted,$untrusted);
@@ -12205,9 +12244,9 @@
         } elsif ($context eq 'domain') {
             ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('domroles',$defdom);
         }
-        $domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,$trusted,$untrusted);
+        $domform = &select_dom_form($currdom,'srchdomain',$allow_blank,1,undef,$trusted,$untrusted,'','srchdomain');
     }
-    my $srchinsel = ' <select name="srchin">';
+    my $srchinsel = ' <select name="srchin" aria-label="'.$html_lt{'srchin'}.'">';
 
     my @srchins = ('crs','dom','alc','instd');
 
@@ -12229,7 +12268,7 @@
     }
     $srchinsel .= "\n  </select>\n";
 
-    my $srchbysel =  ' <select name="srchby">';
+    my $srchbysel =  ' <select name="srchby" aria-label="'.$html_lt{'srchfield'}.'">';
     foreach my $option ('lastname','lastfirst','uname') {
         if ($curr_selected{'srchby'} eq $option) {
             $srchbysel .= '
@@ -12241,7 +12280,7 @@
     }
     $srchbysel .= "\n  </select>\n";
 
-    my $srchtypesel = ' <select name="srchtype">';
+    my $srchtypesel = ' <select name="srchtype" aria-label="'.$html_lt{'srchscope'}.'">';
     foreach my $option ('begins','contains','exact') {
         if ($curr_selected{'srchtype'} eq $option) {
             $srchtypesel .= '
@@ -12390,13 +12429,13 @@
 END_BLOCK
 
     $output .= &Apache::lonhtmlcommon::start_pick_box().
-               &Apache::lonhtmlcommon::row_title($html_lt{'doma'}).
+               &Apache::lonhtmlcommon::row_title('<label for="srchdomain">'.$html_lt{'doma'}.'</label>').
                $domform.
                &Apache::lonhtmlcommon::row_closure().
                &Apache::lonhtmlcommon::row_title($html_lt{'usr'}).
                $srchbysel.
                $srchtypesel. 
-               '<input type="text" size="15" name="srchterm" value="'.$srchterm.'" />'.
+               '<input type="text" size="15" name="srchterm" value="'.$srchterm.'" aria-label="'.$html_lt{'srchterm'}.'" />'.
                $srchinsel.
                &Apache::lonhtmlcommon::row_closure(1). 
                &Apache::lonhtmlcommon::end_pick_box().
@@ -18854,12 +18893,14 @@
                 $filter->{'ownerdomfilter'} =
                     &LONCAPA::clean_domain($filter->{$item});
                 $ownerdomselectform = &select_dom_form($filter->{'ownerdomfilter'},
-                                                       'ownerdomfilter',1);
+                                                       'ownerdomfilter',1,'','','',
+                                                       '','','ownerdomfilter');
             } elsif ($item eq 'personfilter') {
                 $filter->{$item} = &LONCAPA::clean_username($filter->{$item});
             } elsif ($item eq 'persondomfilter') {
                 $persondomselectform = &select_dom_form($filter->{'persondomfilter'},
-                                                        'persondomfilter',1);
+                                                        'persondomfilter',1,'','','',
+                                                        '','','persondomfilter');
             } else {
                 $filter->{$item} =~ s/\W//g;
             }
@@ -18876,12 +18917,13 @@
             }
             if ($fixeddom) {
                 $domainselectform = '<input type="hidden" name="domainfilter"'.
-                                    ' value="'.$codedom.'" />'.
+                                    ' id="domainfilter" value="'.$codedom.'" />'.
                                     &Apache::lonnet::domain($codedom,'description');
             } else {
                 $domainselectform = &select_dom_form($filter->{$item},
                                                      'domainfilter',
-                                                      $allow_blank,'',$onchange);
+                                                     $allow_blank,'',$onchange,'',
+                                                     '','','domainfilter');
             }
         } else {
             $list->{$item} = &HTML::Entities::encode($filter->{$item},'<>&"');
@@ -18889,11 +18931,11 @@
     }
 
     # last course activity filter and selection
-    $sincefilterform = &timebased_select_form('sincefilter',$filter);
+    $sincefilterform = &timebased_select_form('sincefilter',$filter,'sincefilter');
 
     # course created filter and selection
     if (exists($filter->{'createdfilter'})) {
-        $createdfilterform = &timebased_select_form('createdfilter',$filter);
+        $createdfilterform = &timebased_select_form('createdfilter',$filter,'createdfilter');
     }
 
     my $prefix = $crstype;
@@ -18919,11 +18961,11 @@
         } elsif ($crstype eq 'Placement') {
             $typeval = 'Placement';
         }
-        $typeselectform = '<input type="hidden" name="type" value="'.$typeval.'" />';
+        $typeselectform = '<input type="hidden" name="type" id="type" value="'.$typeval.'" />';
     } else {
         $typeselectform =  '<select name="type" size="1"';
         if ($onchange) {
-            $typeselectform .= ' onchange="'.$onchange.'"';
+            $typeselectform .= ' onchange="'.$onchange.'" id="type"';
         }
         $typeselectform .= '>'."\n";
         foreach my $posstype ('Course','Community','Placement') {
@@ -18974,7 +19016,7 @@
             }
             if ($instcodeform eq '') {
                 $instcodeform =
-                    '<input type="text" name="instcodefilter" size="10" value="'.
+                    '<input type="text" name="instcodefilter" id="instcodefilter" size="10" value="'.
                     $list->{'instcodefilter'}.'" />';
                 $instcodetitle = $lt{'ins'};
             } else {
@@ -19021,17 +19063,17 @@
     }
     $output .= "<br />\n".&Apache::lonhtmlcommon::start_pick_box();
     if ($sincefilterform) {
-        $output .= &Apache::lonhtmlcommon::row_title($lt{'cac'})
+        $output .= &Apache::lonhtmlcommon::row_title('<label for="sincefilter">'.$lt{'cac'}.'</label>')
                   .$sincefilterform
                   .&Apache::lonhtmlcommon::row_closure();
     }
     if ($createdfilterform) {
-        $output .= &Apache::lonhtmlcommon::row_title($lt{'ccr'})
+        $output .= &Apache::lonhtmlcommon::row_title('<label for="createdfilter">'.$lt{'ccr'}.'</label>')
                   .$createdfilterform
                   .&Apache::lonhtmlcommon::row_closure();
     }
     if ($domainselectform) {
-        $output .= &Apache::lonhtmlcommon::row_title($lt{'cdo'})
+        $output .= &Apache::lonhtmlcommon::row_title('<label for="domainfilter">'.$lt{'cdo'}.'</label>')
                   .$domainselectform
                   .&Apache::lonhtmlcommon::row_closure();
     }
@@ -19039,35 +19081,53 @@
         if (($formname eq 'ccrs') || ($formname eq 'requestcrs')) {
             $output .= $typeselectform;
         } else {
-            $output .= &Apache::lonhtmlcommon::row_title($lt{'cog'})
+            $output .= &Apache::lonhtmlcommon::row_title('<label for="type">'.$lt{'cog'}.'</label>')
                       .$typeselectform
                       .&Apache::lonhtmlcommon::row_closure();
         }
     }
     if ($instcodeform) {
-        $output .= &Apache::lonhtmlcommon::row_title($instcodetitle)
-                  .$instcodeform
-                  .&Apache::lonhtmlcommon::row_closure();
+        if ($$numtitlesref) {
+            $output .= &Apache::lonhtmlcommon::row_title($instcodetitle)
+                      .$instcodeform
+                      .&Apache::lonhtmlcommon::row_closure();
+        } else {
+            $output .= &Apache::lonhtmlcommon::row_title('<label for="instcodefilter">'.$instcodetitle.'</label>')
+                      .$instcodeform
+                      .&Apache::lonhtmlcommon::row_closure();
+        }
     }
     if (exists($filter->{'ownerfilter'})) {
         $output .= &Apache::lonhtmlcommon::row_title($lt{'cow'}).
-                   '<table><tr><td>'.&mt('Username').'<br />'.
+                   '<div role="grid" class="LC_grid" >'.
+                   '<div role = "row" class="LC_grid_row">'.
+                   '<div role = "gridcell" class="LC_grid_cell">'.
+                   '<label>'.&mt('Username').'<br />'.
                    '<input type="text" name="ownerfilter" size="20" value="'.
-                   $list->{'ownerfilter'}.'" /></td><td>'.&mt('Domain').'<br />'.
-                   $ownerdomselectform.'</td></tr></table>'.
+                   $list->{'ownerfilter'}.'" /></label></div>'.
+                   '<div role = "gridcell" class="LC_grid_cell">'.
+                   '<label for="ownerdomfilter">'.&mt('Domain').'</label><br />'.
+                   $ownerdomselectform.'</div>'.
+                   '</div></div>'.
                    &Apache::lonhtmlcommon::row_closure();
     }
     if (exists($filter->{'personfilter'})) {
         $output .= &Apache::lonhtmlcommon::row_title($lt{'cop'}).
-                   '<table><tr><td>'.&mt('Username').'<br />'.
+                   '<div role="grid" class="LC_grid" >'.
+                   '<div role = "row" class="LC_grid_row">'.
+                   '<div role = "gridcell" class="LC_grid_cell">'.
+                   '<label>'.&mt('Username').'<br />'.
                    '<input type="text" name="personfilter" size="20" value="'.
-                   $list->{'personfilter'}.'" /></td><td>'.&mt('Domain').'<br />'.
-                   $persondomselectform.'</td></tr></table>'.
+                   $list->{'personfilter'}.'" /></label></div>'.
+                   '<div role = "gridcell" class="LC_grid_cell">'.
+                   '<label for="persondomfilter">'.&mt('Domain').'</label><br />'.
+                   $persondomselectform.'</div>'.
+                   '</div></div>'.
                    &Apache::lonhtmlcommon::row_closure();
     }
     if (exists($filter->{'coursefilter'})) {
-        $output .= &Apache::lonhtmlcommon::row_title(&mt('LON-CAPA course ID'))
-                  .'<input type="text" name="coursefilter" size="25" value="'
+        $output .= &Apache::lonhtmlcommon::row_title('<label for="coursefilter">'.&mt('LON-CAPA course ID').'</label>')
+                  .'<input type="text" name="coursefilter" id="coursefilter" size="25" value="'
                   .$list->{'coursefilter'}.'" />'
                   .&Apache::lonhtmlcommon::row_closure();
     }
@@ -19076,8 +19136,8 @@
                    $cloneableonlyform.&Apache::lonhtmlcommon::row_closure();
     }
     if (exists($filter->{'descriptfilter'})) {
-        $output .= &Apache::lonhtmlcommon::row_title($lt{'cde'})
-                  .'<input type="text" name="descriptfilter" size="40" value="'
+        $output .= &Apache::lonhtmlcommon::row_title('<label for="descriptfilter">'.$lt{'cde'}.'</label>')
+                  .'<input type="text" name="descriptfilter" id="descriptfilter" size="40" value="'
                   .$list->{'descriptfilter'}.'" />'
                   .&Apache::lonhtmlcommon::row_closure(1);
     }
@@ -19102,6 +19162,17 @@
 
 filter - anonymous hash of criteria and their values
 
+id (optional) - will be used as the id attribute of the select element.
+
+onchange (optional) - can include a javascript onchange item
+
+readonly (optional) - if true will cause the select form
+to be disabled
+
+aria_labelledby (optional) - will be included as the aria-labelledby
+attribute of the select element.
+
+
 Returns: HTML for a select box contained a blank, then six time selections,
          with value set in incoming form variables currently selected. 
 
@@ -19110,7 +19181,7 @@
 =cut
 
 sub timebased_select_form {
-    my ($item,$filter) = @_;
+    my ($item,$filter,$id,$onchange,$readonly,$aria_labelledby) = @_;
     if (ref($filter) eq 'HASH') {
         $filter->{$item} =~ s/[^\d-]//g;
         if (!$filter->{$item}) { $filter->{$item}=-1; }
@@ -19126,7 +19197,8 @@
                              '31104000' => &mt('last year'),
                     'select_form_order' =>
                            ['-1','86400','604800','2592000','7776000',
-                            '15552000','31104000']});
+                            '15552000','31104000']},
+                            $onchange,$readonly,$id,$aria_labelledby);
     }
 }
 
Index: loncom/interface/loncreateuser.pm
diff -u loncom/interface/loncreateuser.pm:1.488 loncom/interface/loncreateuser.pm:1.489
--- loncom/interface/loncreateuser.pm:1.488	Sat Dec 13 13:33:33 2025
+++ loncom/interface/loncreateuser.pm	Mon Dec 15 19:17:39 2025
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.488 2025/12/13 13:33:33 raeburn Exp $
+# $Id: loncreateuser.pm,v 1.489 2025/12/15 19:17:39 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1026,7 +1026,7 @@
             $actiontext = $lt{'srvu'};
             $fixeddom = 1;
         }
-        $r->print("<h3>$actiontext</h3>");
+        $r->print('<h2 class="LC_heading_2">'.$actiontext.'</h2>');
         if ($env{'form.origform'} ne 'crtusername') {
             if ($response) {
                $r->print("\n<div>$response</div>".
@@ -1179,17 +1179,15 @@
 <input type="hidden" name="srchin" value="dom" />
 <input type="hidden" name="forcenewuser" value="1" />
 <input type="hidden" name="origform" value="crtusername" />
-<h3>$title</h3>
+<h2 class="LC_heading_2">$title</h2>
 $showresponse
-<table>
- <tr>
-  <td>$lt{'usr'}:</td>
-  <td><input type="text" size="15" name="srchterm" /></td>
-  <td> $lt{'dom'}:</td><td>$domform</td>
-  <td> $sellink </td>
-  <td> <input name="userrole" type="submit" value="$buttontext" /></td>
- </tr>
-</table>
+<div>
+  <label>$lt{'usr'}: <input type="text" size="15" name="srchterm" /></label>
+   
+  <label>$lt{'dom'}:$domform</label>
+   $sellink 
+   <input name="userrole" type="submit" value="$buttontext" />
+</div>
 </form>
 ENDDOCUMENT
     }
@@ -1256,6 +1254,7 @@
                                        'stusel'         => "Select a user to enroll as a student",
                                        'memsel'         => "Select a user to enroll as a member",
                                        'vacsel'         => "Select a user to view access log",
+                                       'seluser'        => "Select",
                                        'username'       => "username",
                                        'domain'         => "domain",
                                        'lastname'       => "last name",
@@ -1299,9 +1298,9 @@
             }
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
             if ($readonly) {
-                $r->print('<h3>'.$lt{'suvr'}.'</h3>');
+                $r->print('<h2 class="LC_heading_2">'.$lt{'suvr'}.'</h2>');
             } else {
-                $r->print('<h3>'.$lt{'usel'}.'</h3>');
+                $r->print('<h2 class="LC_heading_2">'.$lt{'usel'}.'</h2>');
             }
         } elsif ($env{'form.action'} eq 'singlestudent') {
             $r->print($jscript."<b>");
@@ -1312,23 +1311,23 @@
             }
             $r->print("</b><br />");
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
-            $r->print('</form><h3>');
+            $r->print('</form><h2 class="LC_heading_2">');
             if ($crstype eq 'Community') {
                 $r->print($lt{'memsel'});
             } else {
                 $r->print($lt{'stusel'});
             }
-            $r->print('</h3>');
+            $r->print('</h2>');
         } elsif ($env{'form.action'} eq 'accesslogs') {
             $r->print("<b>$lt{'srcva'}</b><br />");
             $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,undef,1));
-            $r->print('<h3>'.$lt{'vacsel'}.'</h3>');
+            $r->print('<h2 class="LC_heading_2">'.$lt{'vacsel'}.'</h2>');
         }
     }
     $r->print('<form name="usersrchform" method="post" action="">'.
               &Apache::loncommon::start_data_table()."\n".
               &Apache::loncommon::start_data_table_header_row()."\n".
-              ' <th> </th>'."\n");
+              ' <th>'.$lt{'seluser'}.'</th>'."\n");
     foreach my $field (@fields) {
         $r->print(' <th><a href="javascript:document.usersrchform.sortby.value='.
                   "'".$field."'".';document.usersrchform.submit();">'.
@@ -1678,7 +1677,7 @@
                                            'requestcourses').
                       &Apache::loncommon::end_data_table());
         }
-        $r->print('</div>'."\n".'<div class="LC_left_float"><h3>'.
+        $r->print('</div>'."\n".'<div class="LC_left_float"><h3 class="LC_heading_3">'.
                   $lt{'lg'}.'</h3>');
         my ($fixedauth,$varauth,$authmsg); 
         if (ref($rulematch{$ccuname.':'.$ccdomain}) eq 'HASH') {
@@ -1982,15 +1981,15 @@
     }
     my $cid = $env{'request.course.id'};
     my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid);
-    my $date_table = '<h3>'.&mt('Starting and Ending Dates').'</h3>'."\n".
+    my $date_table = '<h3 class="LC_heading_3">'.&mt('Starting and Ending Dates').'</h3>'."\n".
         &Apache::lonuserutils::date_setting_table(undef,undef,$context,
                                                   undef,$formname,$permission);
     my $rowtitle = 'Section';
-    my $secbox = '<h3>'.&mt('Section and Credits').'</h3>'."\n".
+    my $secbox = '<h3 class="LC_heading_3">'.&mt('Section and Credits').'</h3>'."\n".
         &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle,
                                               $permission,$context,'',$crstype,
                                               $showcredits,$credits);
-    my $output = $date_table.$secbox;
+    my $output = '<div>'.$date_table.'</div><div>'.$secbox.'</div>';
     return $output;
 }
 
@@ -2329,10 +2328,12 @@
                       &Apache::loncommon::end_data_table_row();
             }
         }
-        unless($output{$type} eq '') {
-            $output{$type} = '<tr class="LC_info_row">'.
-                      "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
-                      $output{$type};
+        unless ($output{$type} eq '') {
+            if ($context eq 'domain') {
+                $output{$type} = '<tr class="LC_info_row">'.
+                                 "<td align='center' colspan='7'>".&mt($type)."</td></tr>".
+                                 $output{$type};
+            }
             $rolesdisplay = 1;
         }
     }
@@ -2636,17 +2637,13 @@
 ENDJS
 
                 $outcome .= '<h3>'.$lt{'ld'}.'</h3>'.
-                            &Apache::loncommon::start_data_table().
-                            &Apache::loncommon::start_data_table_row().
-                            '<td>'.&mt('Internally authenticated').'<br />'.&mt("Change user's password?").
+                            '<div>'.&mt('Internally authenticated').'<br />'.&mt("Change user's password?").
                             '<label><input type="radio" name="newintpwd" value="0" checked="checked" onclick="togglePwd(this.form);" />'.
                             &mt('No').'</label>'.(' 'x2).
                             '<label><input type="radio" name="newintpwd" value="1" onclick="togglePwd(this.form);" />'.&mt('Yes').'</label>'.
                             '<div id="LC_ownersetpwd" style="display:none">'.
                             '  '.&mt('Password').' <input type="password" size="15" name="intarg" value="" />'.
-                            '<label><input type="checkbox" name="visible" onclick="if (this.checked) { this.form.intarg.type='."'text'".' } else { this.form.intarg.type='."'password'".' }" />'.&mt('Visible input').'</label></div></td>'.
-                            &Apache::loncommon::end_data_table_row().
-                            &Apache::loncommon::end_data_table();
+                            '<label><input type="checkbox" name="visible" onclick="if (this.checked) { this.form.intarg.type='."'text'".' } else { this.form.intarg.type='."'password'".' }" />'.&mt('Visible input').'</label></div></div>';
             }
             if (&Apache::lonnet::allowed('udp',$ccdomain)) {
                 # Current user has rights to view domain preferences for user's domain
@@ -2669,11 +2666,7 @@
                     $result = &mt('Currently LTI authenticated.');
                 }
                 $outcome = '<h3>'.$lt{'ld'}.'</h3>'.
-                           &Apache::loncommon::start_data_table().
-                           &Apache::loncommon::start_data_table_row().
-                           '<td>'.$result.'</td>'.
-                           &Apache::loncommon::end_data_table_row()."\n".
-                           &Apache::loncommon::end_data_table();
+                           '<div>'.$result.'</div>';
             } elsif (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
                 my %lt=&Apache::lonlocal::texthash(
                            'ccld'  => "Change Current Login Data",
@@ -2945,7 +2938,10 @@
         if ($item eq 'generation') {
             $rowtitle = $genhelp.$rowtitle;
         }
-        my $row = &Apache::lonhtmlcommon::row_title('<label for="userinfo_'.$item.'">'.$rowtitle.'</label>',undef,'LC_oddrow_value')."\n";
+        unless ((!$newuser) && (!$canmodify{$item})) {
+            $rowtitle = '<label for="userinfo_'.$item.'">'.$rowtitle.'</label>';
+        }
+        my $row = &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
         if ($newuser) {
             if (ref($inst_results) eq 'HASH') {
                 if ($inst_results->{$item} ne '') {
@@ -3150,7 +3146,7 @@
     my $end       = '</span><br /><br />';
     my $rtnlink   = '<a href="javascript:backPage(document.userupdate,'.
                     "'$env{'form.prevphase'}','modify')".'" />'.
-                    &mt('Return to previous page').'</a>');
+                    &mt('Return to previous page').'</a>';
     my $now = time;
     my $title;
     if (exists($env{'form.makeuser'})) {
@@ -3274,9 +3270,9 @@
         return;
     }
 
-    $r->print('<h3>'.&mt('User [_1] in domain [_2]',
+    $r->print('<h2 class="LC_heading_2">'.&mt('User [_1] in domain [_2]',
                         $env{'form.ccuname'}.' ('.&Apache::loncommon::plainname($env{'form.ccuname'},
-                        $env{'form.ccdomain'}).')', $env{'form.ccdomain'}).'</h3>');
+                        $env{'form.ccdomain'}).')', $env{'form.ccdomain'}).'</h2>');
     my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,2);
 
     my (%alerts,%rulematch,%inst_results,%curr_rules);
@@ -6337,7 +6333,7 @@
                                                                    $crstype,$showcredits));
         } else {
             $r->print(&header(undef,{'no_nav_bar' => 1}).
-                     '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>'); 
+                      '<span class="LC_error">'.&mt('You do not have permission to modify dates or sections for users').'</span>');
         }
     } elsif ($env{'form.action'} eq 'selfenroll') {
         my %currsettings;
@@ -6368,7 +6364,7 @@
                 $args = { bread_crumbs           => $brcrum,
                           bread_crumbs_component => 'Configure Self-enrollment'};
                 $r->print(&header(undef,$args));
-                $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
+                $r->print('<h2 class="LC_heading_2">'.&mt('Self-enrollment with a student role').'</h2>'."\n");
                 &print_selfenroll_menu($r,'course',$cid,$cdom,$cnum,\%currsettings);
             } elsif ($env{'form.state'} eq 'done') {
                 push (@{$brcrum},
@@ -6377,7 +6373,7 @@
                 $args = { bread_crumbs           => $brcrum,
                           bread_crumbs_component => 'Self-enrollment result'};
                 $r->print(&header(undef,$args));
-                $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
+                $r->print('<h2 class="LC_heading_2">'.&mt('Self-enrollment with a student role').'</h2>'."\n");
                 &update_selfenroll_config($r,$cid,$cdom,$cnum,$context,$crstype,\%currsettings);
             }
         } elsif ($permission->{selfenrollview}) {
@@ -6388,7 +6384,7 @@
             $args = { bread_crumbs           => $brcrum,
                       bread_crumbs_component => 'Self-enrollment Settings'};
             $r->print(&header(undef,$args));
-            $r->print('<h3>'.&mt('Self-enrollment with a student role').'</h3>'."\n");
+            $r->print('<h2 class="LC_heading_2">'.&mt('Self-enrollment with a student role').'</h2>'."\n");
             &print_selfenroll_menu($r,'course',$cid,$cdom,$cnum,\%currsettings,'',1);
         } else {
             $r->print(&header(undef,{'no_nav_bar' => 1}).
@@ -6466,7 +6462,7 @@
             }
         } else {
             $r->print(&header(undef,{'no_nav_bar' => 1}).
-                     '<span class="LC_error">'.&mt('You do not have permission to view queued requests from other domains for assignment of roles to users from this domain.').'</span>');
+                      '<span class="LC_error">'.&mt('You do not have permission to view queued requests from other domains for assignment of roles to users from this domain.').'</span>');
         }
     } elsif ($env{'form.action'} eq 'camanagers') {
         if (($permission->{cusr}) && ($context eq 'author')) {
@@ -6500,6 +6496,7 @@
                 my $args = { 'bread_crumbs' => $brcrum };
                 $r->print(&Apache::loncommon::start_page('Configure co-author listing',undef,
                                                          $args).
+                          "\n".'<div class="LC_landmark" role="main" id="LC_main_content">'."\n".
                           &Apache::lonviewcoauthors::edit_settings($audom,$auname,$role,
                                                                    '/adm/createuser'));
             } else {
@@ -6510,6 +6507,7 @@
                 my $args = { 'bread_crumbs' => $brcrum };
                 $r->print(&Apache::loncommon::start_page('Coauthor-viewable list',undef,
                                                          $args));
+                $r->print("\n".'<div class="LC_landmark" role="main" id="LC_main_content">');
                 my %viewsettings =
                     &Apache::lonviewcoauthors::retrieve_view_settings($auname,$audom,$role);
                 if ($viewsettings{'show'} eq 'none') {
@@ -6536,6 +6534,7 @@
         my $args = { 'bread_crumbs' => $brcrum };
         $r->print(&Apache::loncommon::start_page('Coauthor-viewable list',undef,
                                                  $args));
+        $r->print("\n".'<div class="LC_landmark" role="main" id="LC_main_content">');
         my %viewsettings =
             &Apache::lonviewcoauthors::retrieve_view_settings($auname,$audom,$role);
         if ($viewsettings{'show'} eq 'none') {
@@ -7375,8 +7374,7 @@
                  '// <![CDATA['."\n".
                  $setsec_js."\n".$selfenroll_js."\n".
                  '// ]]>'."\n".
-                 '</script>'."\n".
-                 '<h3>'.$lt->{'selfenroll'}.'</h3>'."\n";
+                 '</script>'."\n";
     my $visactions = &cat_visibility($cdom);
     my ($cathash,%cattype);
     my %domconfig = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
@@ -7488,25 +7486,21 @@
                 my $showdomdesc = 1;
                 my $includeempty = 1;
                 my $num = 0;
-                $output .= &Apache::loncommon::start_data_table().
-                           &Apache::loncommon::start_data_table_row()
-                           .'<td colspan="2"><span class="LC_nobreak"><label>'
+                $output .= '<div><fieldset style="display:inline">'
                            .&mt('Any user in any domain:')
-                           .' <input type="radio" name="selfenroll_all" value="1" ';
+                           .' <label><input type="radio" name="selfenroll_all" value="1" ';
                 if ($curr_types eq '*') {
                     $output .= ' checked="checked" '; 
                 }
                 $output .= 'onchange="javascript:update_types('.
                            "'selfenroll_all'".');"'.$disabled.' />'.&mt('Yes').'</label>'.
-                           '  <input type="radio" name="selfenroll_all" value="0" ';
+                           '  <label><input type="radio" name="selfenroll_all" value="0" ';
                 if ($curr_types ne '*') {
                     $output .= ' checked="checked" ';
                 }
                 $output .= ' onchange="javascript:update_types('.
-                           "'selfenroll_all'".');"'.$disabled.' />'.&mt('No').'</label></td>'.
-                           &Apache::loncommon::end_data_table_row().
-                           &Apache::loncommon::end_data_table().
-                           &mt('Or').'<br />'.
+                           "'selfenroll_all'".');"'.$disabled.' />'.&mt('No').'</label></fieldset></div>'.
+                           '<div>'.&mt('Or').'</div><br />'.
                            &Apache::loncommon::start_data_table();
                 my %currdoms;
                 if ($curr_types eq '') {
@@ -7542,9 +7536,11 @@
                 }
                 my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$cdom);
                 $output .= &Apache::loncommon::start_data_table_row()
-                           .'<td colspan="2"><span class="LC_nobreak">'.$add_domtitle.'</span><br />'
+                           .'<td colspan="2"><span class="LC_nobreak">'
+                           .'<label for="selfenroll_newdom">'.$add_domtitle.'</label></span><br />'
                            .&Apache::loncommon::select_dom_form('','selfenroll_newdom',
-                                                                $includeempty,$showdomdesc,'',$trusted,$untrusted,$readonly)
+                                                                $includeempty,$showdomdesc,'',
+                                                                $trusted,$untrusted,$readonly,'selfenroll_newdom')
                            .'<input type="hidden" name="selfenroll_types_total" value="'.$num.'" />'
                            .'</td>'.&Apache::loncommon::end_data_table_row()
                            .&Apache::loncommon::end_data_table();
@@ -7570,11 +7566,11 @@
                     $regon = '';
                     $regoff = ' checked="checked" ';
                 }
-                $output .= '<label>'.
+                $output .= '<fieldset class="LC_borderless"><label>'.
                            '<input type="radio" name="selfenroll_registered" value="1"'.$regon.$disabled.' />'.
                            &mt('Yes').'</label>  <label>'.
                            '<input type="radio" name="selfenroll_registered" value="0"'.$regoff.$disabled.' />'.
-                           &mt('No').'</label>';
+                           &mt('No').'</label></fieldset>';
             } elsif ($item eq 'enroll_dates') {
                 my ($starttime,$endtime);
                 if (ref($currsettings) eq 'HASH') {
@@ -7646,14 +7642,20 @@
                     $output .= '<br />'.&mt('(Set by Domain Coordinator)');
                     next;
                 }
+                my $arialabel = &mt('Existing sections');
                 my $sections_select = 
-                    &Apache::lonuserutils::course_sections(\%sections_count,'st',$currsec,$disabled);
+                    &Apache::lonuserutils::course_sections(\%sections_count,'st',$currsec,$disabled,
+                                                           $arialabel);
                 $output .= '<table class="LC_createuser">'."\n".
+                           '<tr class="LC_visually_hidden">'.
+                           '<th>'.&mt('Choose an existing section').'</th>'.
+                           '<th>'.&mt('Instantiate a new section').'</th>'."\n".
+                           '</tr>'."\n".
                            '<tr class="LC_section_row">'."\n".
                            '<td align="center">'.&mt('Existing sections')."\n".
                            '<br />'.$sections_select.'</td><td align="center">'.
-                           &mt('New section').'<br />'."\n".
-                           '<input type="text" name="newsec" size="15" value="'.$newsecval.'"'.$disabled.' />'."\n".
+                           '<label>'.&mt('New section').'<br />'."\n".
+                           '<input type="text" name="newsec" size="15" value="'.$newsecval.'"'.$disabled.' /></label>'."\n".
                            '<input type="hidden" name="sections" value="" />'."\n".
                            '</td></tr></table>'."\n";
             } elsif ($item eq 'approval') {
@@ -7672,6 +7674,7 @@
                     next;
                 }
                 $appchecked{$currapproval} = ' checked="checked"';
+                $output .= '<fieldset class="LC_borderless"><legend></legend>';
                 for my $i (0..2) {
                     $output .= '<label>'.
                                '<input type="radio" name="selfenroll_approval" value="'.$i.'"'.
@@ -7698,12 +7701,10 @@
                 if (@ccs) {
                     my $style;
                     unless ($currapproval) {
-                        $style = ' style="display: none;"'; 
+                        $style = ' style="display: none;"';
                     }
-                    $output .= '<br /><div id="notified"'.$style.'>'.
-                               &mt('Personnel to be notified when an enrollment request needs approval, or has been approved:').' '.
-                               &Apache::loncommon::start_data_table().
-                               &Apache::loncommon::start_data_table_row();
+                    $output .= '</fieldset><br /><div id="notified"'.$style.'>'.
+                               &mt('Personnel to be notified when an enrollment request needs approval, or has been approved:').'<br />';
                     my $count = 0;
                     my $numcols = 4;
                     foreach my $cc (sort(@ccs)) {
@@ -7712,26 +7713,13 @@
                         if ($notified{$cc}) {
                             $notifyon = ' checked="checked" ';
                         }
-                        if ($count && !$count%$numcols) {
-                            $output .= &Apache::loncommon::end_data_table_row().
-                                       &Apache::loncommon::start_data_table_row()
-                        }
-                        $output .= '<td><span class="LC_nobreak"><label>'.
+                        $output .= '<span class="LC_nobreak"><label>'.
                                    '<input type="checkbox" name="selfenroll_notify"'.$notifyon.' value="'.$cc.'"'.$disabled.' />'.
                                    &Apache::loncommon::plainname($ccuname,$ccudom).
-                                   '</label></span></td>';
+                                   '</label></span> ';
                         $count ++;
                     }
-                    my $rem = $count%$numcols;
-                    if ($rem) {
-                        my $emptycols = $numcols - $rem;
-                        for (my $i=0; $i<$emptycols; $i++) { 
-                            $output .= '<td> </td>';
-                        }
-                    }
-                    $output .= &Apache::loncommon::end_data_table_row().
-                               &Apache::loncommon::end_data_table().
-                               '</div>';
+                    $output .= '</div>';
                 }
             } elsif ($item eq 'limit') {
                 my ($crslimit,$selflimit,$nolimit,$currlim,$currcap);
@@ -7766,17 +7754,17 @@
                     $selflimit = ' ';
                     $nolimit = ' checked="checked" ';
                 }
-                $output .= '<table><tr><td><label>'.
+                $output .= '<fieldset class="LC_borderless"><div style="padding: 0 2px 0 0"><label>'.
                            '<input type="radio" name="selfenroll_limit" value="none"'.$nolimit.$disabled.'/>'.
-                           &mt('No limit').'</label></td><td><label>'.
+                           &mt('No limit').'</label>  <label>'.
                            '<input type="radio" name="selfenroll_limit" value="allstudents"'.$crslimit.$disabled.'/>'.
-                           &mt('Limit by total students').'</label></td><td><label>'.
+                           &mt('Limit by total students').'</label>  <label>'.
                            '<input type="radio" name="selfenroll_limit" value="selfenrolled"'.$selflimit.$disabled.'/>'.
                            &mt('Limit by total self-enrolled students').
-                           '</td></tr><tr>'.
-                           '<td> </td><td colspan="2"><span class="LC_nobreak">'.
-                           (' 'x3).&mt('Maximum number allowed: ').
-                           '<input type="text" name="selfenroll_cap" size = "5" value="'.$currcap.'"'.$disabled.' /></td></tr></table>';
+                           '</div>'.
+                           '<div style="margin-left: 40px"><span class="LC_nobreak">'.
+                           '<label>'.&mt('Maximum number allowed: ').
+                           '<input type="text" name="selfenroll_cap" size = "5" value="'.$currcap.'"'.$disabled.' /></label></div></fieldset>';
             }
             $output .= &Apache::lonhtmlcommon::row_closure(1);
         }
@@ -7975,8 +7963,8 @@
                    ."'selfenroll_activate','$num'".');" />'
                    .&mt('Activate').'</label></span></td>';
         my @currinsttypes;
-        $output .= '<td>'.&mt('User types:').'<br />'
-                   .&selfenroll_inst_types($num,$newdom,\@currinsttypes).'</td>'
+        $output .= '<td><fieldset class="LC_borderless">'.&mt('User types:').'<br />'
+                   .&selfenroll_inst_types($num,$newdom,\@currinsttypes).'</fieldset></td>'
                    .&Apache::loncommon::end_data_table_row();
     }
     return $output;
@@ -7997,14 +7985,14 @@
         if (keys(%{$usertypes}) > 0) {
             $othervalue = 'other';
         }
-        $output .= '<table><tr>';
+        $output .= '<div>';
         foreach my $type (@{$types}) {
             if (($count > 0) && ($count%$numinrow == 0)) {
-                $output .= '</tr><tr>';
+                $output .= '</div><div>';
             }
             if (defined($usertypes->{$type})) {
                 my $esc_type = &escape($type);
-                $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.
+                $output .= '<span class="LC_nobreak"><label><input type = "checkbox" value="'.
                            $esc_type.'" ';
                 if (ref($currinsttypes) eq 'ARRAY') {
                     if (@{$currinsttypes} > 0) {
@@ -8017,14 +8005,14 @@
                         $output .= 'checked="checked"';
                     }
                 }
-                $output .= ' name="selfenroll_types_'.$num.'"'.$disabled.' />'.$usertypes->{$type}.'</label></span></td>';
+                $output .= ' name="selfenroll_types_'.$num.'"'.$disabled.' />'.$usertypes->{$type}.'</label></span> ';
             }
             $count ++;
         }
         if (($count > 0) && ($count%$numinrow == 0)) {
-            $output .= '</tr><tr>';
+            $output .= '</div><div>';
         }
-        $output .= '<td><span class="LC_nobreak"><label><input type = "checkbox" value="'.$othervalue.'"';
+        $output .= '<span class="LC_nobreak"><label><input type = "checkbox" value="'.$othervalue.'"';
         if (ref($currinsttypes) eq 'ARRAY') {
             if (@{$currinsttypes} > 0) {
                 if (grep(/^any$/,@{$currinsttypes})) { 
@@ -8040,7 +8028,7 @@
         } else {
             $output .= ' checked="checked"';
         }
-        $output .= ' name="selfenroll_types_'.$num.'"'.$disabled.' />'.$othertitle.'</label></span></td></tr></table>';
+        $output .= ' name="selfenroll_types_'.$num.'"'.$disabled.' />'.$othertitle.'</label></span></div>';
     }
     return $output;
 }
@@ -8176,7 +8164,7 @@
     # Table Header
     my $tableheader = 
         &Apache::loncommon::start_data_table_header_row()
-       .'<th> </th>'
+       .'<th>#</th>'
        .'<th>'.&mt('When').'</th>'
        .'<th>'.&mt('Who made the change').'</th>'
        .'<th>'.&mt('Changed User').'</th>'
@@ -8730,11 +8718,12 @@
 sub role_display_filter {
     my ($context,$formname,$cdom,$cnum,$curr,$version,$crstype) = @_;
     my $nolink = 1;
-    my $output = '<table><tr><td valign="top">'.
-                 '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
-                 &Apache::lonmeta::selectbox('show',$curr->{'show'},'','',undef,
+    my $output = '<div class="LC_left_float" style="padding: 0; vertical-align: top">'.
+                 '<span class="LC_nobreak"><b><label for="show">'.
+                 &mt('Changes/page').'</label>:</b></span><br />'.
+                 &Apache::lonmeta::selectbox('show',$curr->{'show'},'','show',undef,
                                               (&mt('all'),5,10,20,50,100,1000,10000)).
-                 '</td><td>  </td>';
+                 '</div>';
     my $startform =
         &Apache::lonhtmlcommon::date_setter($formname,'rolelog_start_date',
                                             $curr->{'rolelog_start_date'},undef,
@@ -8744,15 +8733,22 @@
                                             $curr->{'rolelog_end_date'},undef,
                                             undef,undef,undef,undef,undef,undef,$nolink);
     my %lt = &rolechg_contexts($context,$crstype);
-    $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br />'.
-               '<table><tr><td>'.&mt('After:').
-               '</td><td>'.$startform.'</td></tr>'.
-               '<tr><td>'.&mt('Before:').'</td>'.
-               '<td>'.$endform.'</td></tr></table>'.
-               '</td>'.
-               '<td>  </td>'.
-               '<td valign="top"><b>'.&mt('Role:').'</b><br />'.
-               '<select name="role"><option value="any"';
+    $output .= '<div class="LC_left_float" style="padding: 0 2px 0 0; vertical-align: top">'.
+               '<b>'.&mt('Window during which changes occurred:').'</b>'.
+               '<div style="padding-top: 0; margin-top:0; vertical-align: top" role="grid" class="LC_grid">'.
+               '<div role="row" class="LC_grid_row">'.
+               '<div role="gridcell" class="LC_grid_cell">'.
+               &mt('After:').'</div>'.
+               '<div role="gridcell" class="LC_grid_cell">'.$startform.'</div>'.
+               '</div>'.
+               '<div role="row" class="LC_grid_row">'.
+               '<div role="gridcell" class="LC_grid_cell">'.
+               &mt('Before:').'</div>'.
+               '<div role="gridcell" class="LC_grid_cell">'.$endform.'</div>'.
+               '</div></div></div>'.
+               '<div class="LC_left_float" style="padding: 0; vertical-align: top">'.
+               '<b><label for="chgrole">'.&mt('Role').'</label>:</b><br />'.
+               '<select name="role" id="chgrole"><option value="any"';
     if ($curr->{'role'} eq 'any') {
         $output .= ' selected="selected"';
     }
@@ -8771,10 +8767,10 @@
         }
         $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';
     }
-    $output .= '</select></td>'.
-               '<td>  </td>'.
-               '<td valign="top"><b>'.
-               &mt('Context:').'</b><br /><select name="chgcontext">';
+    $output .= '</select></div>'.
+               '<div class="LC_left_float" style="padding: 0 2px 0 0; vertical-align: top">'.
+               '<b><label for="chgcontext">'.&mt('Context').'</label>:</b><br />'.
+               '<select name="chgcontext" id="chgcontext">';
     my @posscontexts;
     if ($context eq 'course') {
         @posscontexts = ('any','automated','updatenow','createcourse','course','domain','selfenroll','requestcourses','chgtype','ltienroll');
@@ -8797,10 +8793,10 @@
     }
     my @possapprovals = ('any','none','domain','user');
     my %apptxt = &approval_types();
-    $output .= '</select></td>'.
-               '<td>  </td>'.
-               '<td valign="top"><b>'.
-               &mt('Approvals:').'</b><br /><select name="approvals">';
+    $output .= '</select></div>'.
+               '<div class="LC_left_float" style="padding: 0; vertical-align: top">'.
+               '<b><label for="approvals">'.&mt('Approvals').'</label>:</b><br />'.
+               '<select name="approvals" id="approvals">';
     foreach my $approval (@possapprovals) {
         my $selstr = '';
         if ($curr->{'approvals'} eq $approval) {
@@ -8808,10 +8804,10 @@
         }    
         $output .= '<option value="'.$approval.'"'.$selstr.'>'.$apptxt{$approval}.'</option>';
     }
-    $output .= '</select></td></tr></table>';
+    $output .= '</select></div>';
 
     # Update Display button
-    $output .= '<p>'
+    $output .= '<div style="padding:0;clear:both;margin:0;border:0"></div><p>'
               .'<input type="submit" value="'.&mt('Update Display').'" />'
               .'</p>';
 
@@ -9600,7 +9596,7 @@
     # print page header
     $r->print(&header('',$args));
     unless ((ref($permission) eq 'HASH') && ($permission->{'owner'})) {
-        $r->print('<p class="LC_error">'.&mt('You do not have permission to change helpdesk access.').'</p>');
+        $r->print('<p class="LC_error">'.&mt('You do not have permission to change helpdesk access.').'</p></div>');
         return;
     }
     my @accesstypes = ('all','dh','da','none','status','inc','exc');
@@ -10471,7 +10467,7 @@
     my %customroles=&Apache::lonuserutils::my_custom_roles();
     my %lt=&Apache::lonlocal::texthash(
             'exs'  => "Existing sections",
-            'new'  => "Define new section",
+            'new'  => "Define new",
             'ssd'  => "Set Start Date",
             'sed'  => "Set End Date",
             'crl'  => "Course Level",
@@ -10481,7 +10477,9 @@
             'grs'  => "Section",
             'crd'  => "Credits",
             'sta'  => "Start",
-            'end'  => "End"
+            'end'  => "End",
+            'cho'  => "Choose an existing section",
+            'ins'  => "Instantiate a new section",
     );
 
     foreach my $protectedcourse (sort(keys(%{$inccourses}))) {
@@ -10554,16 +10552,18 @@
     my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,
         $lt,$showcredits,$defaultcredits,$crstype) = @_;
     my $creditem;
+    my $actlabel = &mt('Activate [_1] role for course [_2]',$plrole,$protectedcourse);
     my $row = &Apache::loncommon::start_data_table_row().
               ' <td><input type="checkbox" name="act_'.
-              $protectedcourse.'_'.$role.'" /></td>'."\n".
+              $protectedcourse.'_'.$role.'" aria-label="'.$actlabel.'" /></td>'."\n".
               ' <td>'.$plrole.'</td>'."\n".
               ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n";
     if ($showcredits) {
         if (($role eq 'st') && ($crstype eq 'Course')) {
-            $row .= 
+            my $crlabel = &mt('Credits to assign to student role for course [_1]',$protectedcourse);
+            $row .=
                 '<td><input type="text" name="credits_'.$protectedcourse.'_'.
-                $role.'" size="3" value="'.$defaultcredits.'" /></td>';
+                $role.'" size="3" value="'.$defaultcredits.'" aria-label="'.$crlabel.'" /></td>';
         } else {
             $row .= '<td> </td>';
         }
@@ -10577,17 +10577,23 @@
                 $env{'request.course.sec'}.'</td>';
     } else {
         if (ref($sections_count) eq 'HASH') {
-            my $currsec = 
+            my $arialabel = &mt('Existing sections for [_1] in [_2]',
+                                $plrole,$area);
+            my $currsec =
                 &Apache::lonuserutils::course_sections($sections_count,
-                                                       $protectedcourse.'_'.$role);
-            $row .= '<td><table class="LC_createuser">'."\n".
+                                                       $protectedcourse.'_'.$role,'','',$arialabel);
+            $row .= '<td style="padding-top: 0; margin-top: 0" valign="top">'.
+                    '<table class="LC_createuser">'."\n".
+                    '<tr class="LC_visually_hidden">'.
+                    '<th>'.$lt->{'cho'}.'</th>'.
+                    '<th>'.$lt->{'ins'}.'</th>'."\n".
+                    '</tr>'."\n".
                     '<tr class="LC_section_row">'."\n".
                     ' <td valign="top">'.$lt->{'exs'}.'<br />'.
                        $currsec.'</td>'."\n".
-                     ' <td>  </td>'."\n".
-                     ' <td valign="top"> '.$lt->{'new'}.'<br />'.
+                     ' <td valign="top"> <label>'.$lt->{'new'}.'<br />'.
                      '<input type="text" name="newsec_'.$protectedcourse.'_'.$role.
-                     '" value="" />'.
+                     '" value="" size="6" /></label>'.
                      '<input type="hidden" '.
                      'name="sec_'.$protectedcourse.'_'.$role.'" /></td>'."\n".
                      '</tr></table></td>'."\n";
Index: loncom/interface/lonuserutils.pm
diff -u loncom/interface/lonuserutils.pm:1.225 loncom/interface/lonuserutils.pm:1.226
--- loncom/interface/lonuserutils.pm:1.225	Mon Jan 13 01:00:58 2025
+++ loncom/interface/lonuserutils.pm	Mon Dec 15 19:17:39 2025
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Utility functions for managing LON-CAPA user accounts
 #
-# $Id: lonuserutils.pm,v 1.225 2025/01/13 01:00:58 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.226 2025/12/15 19:17:39 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -878,7 +878,8 @@
         $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any');
     }
     my $result = &Apache::loncommon::linked_select_forms
-        ('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'},
+        ('studentform',(' 'x3).'<label for="showrole">'.
+         &mt('Role').'</label>: ',$env{'form.roletype'},
          'roletype','showrole',\%select_menus,
          ['domain','author','course','community'],$onchangefirst,
          $onchangesecond);
@@ -934,7 +935,7 @@
                                 $groupslist,$crstype);
     my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
     $r->print(
-        '<h3>'.&mt('Identify fields in uploaded list')."</h3>\n".
+        '<h2 class="LC_heading_2">'.&mt('Identify fields in uploaded list')."</h2>\n".
         '<p class="LC_info">'.
         &mt('Total number of records found in file: [_1]'
            ,'<b>'.$distotal.'</b>').
@@ -1496,7 +1497,7 @@
     $Str .= &hidden_input('nfields',$i);
     $Str .= &hidden_input('keyfields',$keyfields);
 
-    $Str .= '<h3>'.&mt('Options').'</h3>'
+    $Str .= '<h2 class="LC_heading_2">'.&mt('Options').'</h2>'
            .&Apache::lonhtmlcommon::start_pick_box();
 
     $Str .= &Apache::lonhtmlcommon::row_title(&mt('Login Type'));
@@ -1540,12 +1541,13 @@
     } elsif ($context eq 'author') {
         ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('othcoau',$defdom);
     }
-    $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain'))
-           .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1,undef,$trusted,$untrusted)
+    $Str .= &Apache::lonhtmlcommon::row_title('<label for="defaultdomain">'.&mt('Default domain').'</label>')
+           .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1,undef,
+                                                $trusted,$untrusted,'','defaultdomain')
            .&Apache::lonhtmlcommon::row_closure();
 
     $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates'))
-           ."<p>\n".$date_table."</p>\n"
+           ."\n".$date_table."\n"
            .&Apache::lonhtmlcommon::row_closure();
 
     if ($context eq 'domain') {
@@ -1981,7 +1983,7 @@
                     'new'  => "New section",
                     'crd'  => "Credits",
                   );
-    $options = '<select name="defaultrole">'."\n".
+    $options = '<select name="defaultrole" id="defaultrole">'."\n".
                ' <option value="">'.&mt('Please select').'</option>'."\n"; 
     if ($context eq 'course') {
         $options .= &default_course_roles($context,$checkpriv,$crstype,%customroles);
@@ -2206,7 +2208,7 @@
     }
     my $onchange = "javascript:updateCols('Status');";
     my $status_select = &Apache::lonhtmlcommon::StatusOptions
-        ($env{'form.Status'},undef,undef,$onchange);
+        ($env{'form.Status'},undef,undef,$onchange,undef,'status');
 
     if ($env{'form.showrole'} eq '') {
         if ($context eq 'course') {
@@ -2240,7 +2242,7 @@
         my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
                                            'excel' => "Excel",
                                            'html'  => 'HTML');
-        my $output_selector = '<select size="1" name="output" onchange="javascript:updateCols('."'output'".');" >';
+        my $output_selector = '<select size="1" name="output" id="output" onchange="javascript:updateCols('."'output'".');" >';
         foreach my $outputformat ('html','csv','excel') {
             my $option = '<option value="'.$outputformat.'"';
             if ($outputformat eq $env{'form.output'}) {
@@ -2250,12 +2252,12 @@
             $output_selector .= "\n".$option;
         }
         $output_selector .= '</select>';
-        $r->print('<span class="LC_nobreak">'
-                 .&mt('Output Format: [_1]',$output_selector)
+        $r->print('<span class="LC_nobreak"><label for="output">'
+                 .&mt('Output Format').'</label>: '.$output_selector
                  .'</span>'.(' 'x3));
     }
-    $r->print('<span class="LC_nobreak">'
-             .&mt('User Status: [_1]',$status_select)
+    $r->print('<span class="LC_nobreak"><label for="status">'
+             .&mt('User Status').'</label>: '.$status_select
              .'</span>'.(' 'x3)."\n");
     my $roleselected = '';
     if ($env{'form.showrole'} eq 'Any') {
@@ -2523,11 +2525,11 @@
     my ($role_select);
     if ($context eq 'domain') {
         $role_select = &domain_roles_select();
-        $output = '<span class="LC_nobreak">'
-                 .&mt('Role Type: [_1]',$role_select)
+        $output = '<span class="LC_nobreak"><label for="roletype">'
+                 .&mt('Role Type').'</label>: '.$role_select
                  .'</span>';
     } else {
-        $role_select = '<select name="showrole" onchange="javascript:updateCols('."'showrole'".');">'."\n".
+        $role_select = '<select name="showrole" id="rolefilter" onchange="javascript:updateCols('."'showrole'".');">'."\n".
                        '<option value="Any" '.$roleselected.'>'.
                        &mt('Any role').'</option>';
         my ($roletype,$crstype);
@@ -2554,8 +2556,8 @@
             $role_select .= '<option value="'.$role.'"'.$roleselected.'>'.$plrole.'</option>';
         }
         $role_select .= '</select>';
-        $output = '<span class="LC_nobreak">'
-                 .&mt('Role: [_1]',$role_select)
+        $output = '<span class="LC_nobreak"><label for="rolefilter">'
+                 .&mt('Role').'</label>: '.$role_select
                  .'</span>';
     }
     return $output;
@@ -2737,15 +2739,15 @@
                  '<input type="button" onclick="javascript:checkAll(document.'.$formname.'.showcol);" value="'.&mt('check all').'" />'.
                  (' 'x3).
                  '<input type="button" onclick="javascript:uncheckAll(document.'.$formname.'.showcol);" value="'.&mt('uncheck all').'" />'.
-                 '</span><table>';
+                 '</span><div role="grid" class="LC_grid">';
     
     for (my $i=0; $i<$numposs; $i++) {
         my $rem = $i%($numinrow);
         if ($rem == 0) {
             if ($i > 0) {
-                $output .= '</tr>';
+                $output .= '</div>';
             }
-            $output .= '<tr>';
+            $output .= '<div role="row" class="LC_grid_row">';
         }
         my $checked;
         if ($env{'form.phase'} eq '') {
@@ -2761,16 +2763,7 @@
         } elsif ($disabledchk{$cols[$i]}) {
             $checked = ' disabled="disabled"';
         }
-        if ($i == $numposs-1) {
-            my $colsleft = $numinrow-$rem;
-            if ($colsleft > 1) {
-                $output .= '<td colspan="'.$colsleft.'">';
-            } else {
-                $output .= '<td>';
-            }
-        } else {
-            $output .= '<td>';
-        }
+        $output .= '<div role="gridcell" class="LC_grid_cell">';
         my $style;
         if ($cols[$i] eq 'extent') {
             if (($env{'form.roletype'} eq 'domain') || ($env{'form.roletype'} eq '')) {
@@ -2784,9 +2777,9 @@
         $output .= '<span id="show'.$cols[$i].'"'.$style.'><label>'.
                    '<input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' /><span id="showcoltext'.$cols[$i].'">'.
                    $lt{$cols[$i]}.'</span>'.
-                   '</label></span></td>';
+                   '</label></span></div>';
     }
-    $output .= '</tr></table></fieldset>';
+    $output .= '</div></div></fieldset>';
     return $output;
 }
 
@@ -3394,8 +3387,8 @@
                     }
                 }
             }
-            $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'.
-                       '<table><tr>';
+            $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'
+                      .'<div class="LC_floatleft" style="text-align: top">';
             my @linkdests = ('aboutme');
             if ($permission->{'cusr'}) {
                 unshift (@linkdests,'modify');
@@ -3411,7 +3404,6 @@
                     push(@linkdests,'activity');
                 }
             }
-            $output .= '<td>';
             my $usernamelink = $env{'form.usernamelink'};
             if ($usernamelink eq '') {
                 $usernamelink = 'aboutme';
@@ -3428,10 +3420,11 @@
                 $checkwin = ' checked="checked"';
             }
             $output .=
-                '</td><td valign="top"  style="border-left: 1px solid;">'
-               .'<span class="LC_nobreak"><label>'
+                '</div><div class="LC_floatleft" style="border-left: 0px; vertical-align: top;">'
+               .'<div class="LC_floatleft" style="border-left: 1px solid; margin: 0 0 0 10px; vertical-align: middle;">'
+               .'<br /><span class="LC_nobreak">  <label>'
                .'<input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}
-               .'</label></span></td></tr></table></fieldset></div>';
+               .'</label></span><br /><br /></div></fieldset></div>';
         }
         $output .= "\n".'<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
                   &Apache::loncommon::start_data_table().
@@ -3441,9 +3434,9 @@
  <th><a href=\"javascript:document.$formname.sortby.value='type';document.$formname.submit();\">$lt{'type'}</a></th>
             ";
         } else {
-            $output .= "\n".'<th> </th>'."\n";
+            $output .= "\n".'<th>#</th>'."\n";
             if ($actionselect) {
-                $output .= '<th class="LC_nobreak" valign="top">'.&mt('Select').'</th>'."\n";
+                $output .= '<th class="LC_nobreak" valign="top">'.&mt('select').'</th>'."\n";
             }
         }
         foreach my $item (@cols) {
@@ -3874,7 +3867,7 @@
                         if ($showcheckbox) {
                             $r->print('<td><input type="checkbox" name="'.
                                       'actionlist" value="'.
-                                      &HTML::Entities::encode($checkval,'&<>"').'" />');
+                                      &HTML::Entities::encode($checkval,'&<>"').'" aria-label="'.&mt('select user for action').'" />');
                             foreach my $item ('start','end') {
                                 $r->print('<input type="hidden" name="'.
                                           &HTML::Entities::encode($checkval.'_'.$item,'&<>"').'"'.
@@ -4120,8 +4113,9 @@
                 delete   => "Delete user roles",
                 reenable => "Re-enable expired user roles",
                 activate => "Make future user roles active now",
-                chgdates  => "Change starting/ending dates",
+                chgdates => "Change starting/ending dates",
                 chgsec   => "Change section associated with user roles",
+                act      => "Action to take for selected users",
     );
     # FIXME Add an option to change credits for student roles.
     my ($output,$options,%choices);
@@ -4181,7 +4175,7 @@
         }
     }
     if ($options) {
-        $output = '<select name="bulkaction">'."\n".
+        $output = '<select name="bulkaction" aria-label="'.$lt{'act'}.'">'."\n".
                   '<option value="" selected="selected">'.
                   &mt('Please select').'</option>'."\n".$options."\n".'</select>';
         if ($choices{'dates'}) {
@@ -4405,21 +4399,32 @@
     my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype,
         $showcredits,$credits) = @_;
     my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
-    my $sections_select .= &course_sections(\%sections_count,$role);
+    my $plrole = &Apache::lonnet::plaintext($role,$crstype);
+    my %coursedescription = &Apache::lonnet::coursedescription($cdom.'_'.$cnum);
+    my $arialabel = &mt('Existing sections for [_1] in [_2]',
+                        $plrole,$coursedescription{'description'});
+    my $sections_select .= &course_sections(\%sections_count,$role,'','',$arialabel);
     my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n";
     if ($mode eq 'upload') {
         my ($options,$cb_script,$coursepick) =
             &default_role_selector($context,1,$crstype,$showcredits);
-        $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').
+        $secbox .= &Apache::lonhtmlcommon::row_title('<label for="defaultrole">'.
+                                                     &mt('role').'</label>',
+                                                     'LC_oddrow_value').
                    $options. &Apache::lonhtmlcommon::row_closure(1)."\n";
     }
     $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n";
     if ($env{'request.course.sec'} eq '') {
-        $secbox .= '<table class="LC_createuser"><tr class="LC_section_row">'."\n".
+        $secbox .= '<table class="LC_createuser">'.
+                   '<tr class="LC_visually_hidden">'.
+                   '<th>'.&mt('Choose an existing section').'</th>'.
+                   '<th>'.&mt('Instantiate a new section').'</th>'."\n".
+                   '</tr>'."\n".
+                   '<tr class="LC_section_row">'."\n".
                    '<td align="center">'.&mt('Existing sections')."\n".
                    '<br />'.$sections_select.'</td><td align="center">'.
-                   &mt('New section').'<br />'."\n".
-                   '<input type="text" name="newsec" size="15" value="" />'."\n".
+                   '<label>'.&mt('New section').'<br />'."\n".
+                   '<input type="text" name="newsec" size="15" value="" /></label>'."\n".
                    '<input type="hidden" name="sections" value="" />'."\n".
                    '</td></tr></table>'."\n";
     } else {
@@ -4854,7 +4859,7 @@
                 &mt("How do I create a CSV file from a spreadsheet"))
            ."</div>\n";
     $str .= &Apache::lonhtmlcommon::start_pick_box()
-           .&Apache::lonhtmlcommon::row_title(&mt('File'));
+           .&Apache::lonhtmlcommon::row_title('<label for="upfile">'.&mt('File').'</label>');
     if (&Apache::lonlocal::current_language() ne 'en') {
         if ($context eq 'course') { 
             $str .= '<p class="LC_info">'."\n"
@@ -6450,7 +6455,10 @@
     my ($authnum,%can_assign) =
         &Apache::loncommon::get_assignable_auth($dom);
     if ($authnum) {
-        $response = &Apache::loncommon::start_data_table();
+        $response = &Apache::loncommon::start_data_table().
+                    &Apache::loncommon::start_data_table_header_row('LC_visually_hidden').
+                    '<th>'.&mt('Authentication method').'</th>'.
+                    &Apache::loncommon::end_data_table_row()."\n";
         if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
             $response .= &Apache::loncommon::start_data_table_row().
                          '<td>'.$authformkrb.'</td>'.
@@ -6477,13 +6485,16 @@
 }
 
 sub course_sections {
-    my ($sections_count,$role,$current_sec,$disabled) = @_;
+    my ($sections_count,$role,$current_sec,$disabled,$arialabel) = @_;
     my $output = '';
     my @sections = (sort {$a <=> $b} keys(%{$sections_count}));
     my $numsec = scalar(@sections);
     my $is_selected = ' selected="selected"';
+    if ($arialabel ne '') {
+        $arialabel = ' aria-label="'.$arialabel.'"';
+    }
     if ($numsec <= 1) {
-        $output = '<select name="currsec_'.$role.'"'.$disabled.'>'."\n".
+        $output = '<select name="currsec_'.$role.'"'.$disabled.$arialabel.'>'."\n".
                   '  <option value="">'.&mt('Select').'</option>'."\n";
         if ($current_sec eq 'none') {
             $output .=       
@@ -6506,7 +6517,7 @@
         my $multiple = 4;
         if (scalar(@sections) < 4) { $multiple = scalar(@sections); }
         if ($role eq 'st') {
-            $output .= $disabled.'>'."\n".
+            $output .= $disabled.$arialabel.'>'."\n".
                        '  <option value="">'.&mt('Select').'</option>'."\n";
             if ($current_sec eq 'none') {
                 $output .= 
@@ -6516,7 +6527,7 @@
                        '  <option value="">'.&mt('No section')."</option>\n";
             }
         } else {
-            $output .= 'multiple="multiple" size="'.$multiple.'"'.$disabled.'>'."\n";
+            $output .= 'multiple="multiple" size="'.$multiple.'"'.$disabled.$arialabel.'>'."\n";
         }
         foreach my $sec (@sections) {
             if ($current_sec eq $sec) {


More information about the LON-CAPA-cvs mailing list