[LON-CAPA-cvs] cvs: loncom /interface loncoursegroups.pm

raeburn raeburn at source.lon-capa.org
Tue Jan 20 11:52:44 EST 2026


raeburn		Tue Jan 20 16:52:44 2026 EDT

  Modified files:              
    /loncom/interface	loncoursegroups.pm 
  Log:
  - WCAG 2 compliance
    - Include labels for form elements
    - Replace use of <table> with <div> for layout
  
  
-------------- next part --------------
Index: loncom/interface/loncoursegroups.pm
diff -u loncom/interface/loncoursegroups.pm:1.135 loncom/interface/loncoursegroups.pm:1.136
--- loncom/interface/loncoursegroups.pm:1.135	Tue Jan 20 04:21:12 2026
+++ loncom/interface/loncoursegroups.pm	Tue Jan 20 16:52:44 2026
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: loncoursegroups.pm,v 1.135 2026/01/20 04:21:12 raeburn Exp $
+# $Id: loncoursegroups.pm,v 1.136 2026/01/20 16:52:44 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -157,7 +157,8 @@
     if ($manage_permission) {
         $helpitem = 'Creating_Groups';
     }
-    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups',$helpitem));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups',$helpitem)."\n".
+              '<div class="LC_landmark" role="main" id="LC_main_content">'."\n");
     &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
 		    $manage_permission,$action,$state,$gpterm,$ucgpterm,
 		    $crstype);
@@ -990,7 +991,8 @@
                 &Apache::lonhtmlcommon::add_breadcrumb(
                    {text=>"$trail{$action}{$state}"});
                 $r->print(&Apache::lonhtmlcommon::breadcrumbs
-			  ("Groups Manager","Creating_Groups"));
+			  ("Groups Manager","Creating_Groups")."\n".
+                          '<div class="LC_landmark" role="main" id="LC_main_content">'."\n");
                 &display_control($r,$cdom,$cnum,$action,$state,$page,
                        \%sectioncount,$groupname,$description,$functions,
                        \@tools,$toolprivs,$fixedprivs,$startdate,$enddate,
@@ -1018,7 +1020,8 @@
                         &Apache::lonhtmlcommon::add_breadcrumb(
                    {text=>"View $gpterm".'s'});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
-		  ('Groups Manager'));
+		  ('Groups Manager')."\n".
+                  '<div class="LC_landmark" role="main" id="LC_main_content">'."\n");
         &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission,
 			$manage_permission,$action,$state,$gpterm,$ucgpterm,
 			$crstype);
@@ -1530,7 +1533,6 @@
 				       {'add_entries' => $loaditems,});
     my $output = <<"END";
 $start_page
-<div class="LC_landmark" role="main" id="LC_main_content">
 <form method="post" name="$state" action="">
 
 END
@@ -1568,9 +1570,9 @@
 sub footer {
     my $end_page = &Apache::loncommon::end_page();
        return(<<ENDFOOT);
+   </div>
    <input type="hidden" name="sortby" value="$env{'form.sortby'}" />
   </form>
-  </div>
 $end_page
 ENDFOOT
 }
@@ -1714,23 +1716,23 @@
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}));
 
     # Group Name
-    $r->print(&Apache::lonhtmlcommon::start_pick_box()
-             .&Apache::lonhtmlcommon::row_title($lt{'gnam'})
-    );
+    $r->print(&Apache::lonhtmlcommon::start_pick_box());
     if ($action eq 'create') {
-        $r->print('<input type="text" name="groupname" size="25" />'
+        $r->print(&Apache::lonhtmlcommon::row_title('<label for="groupname">'.$lt{'gnam'}.'</label>')
+                 .'<input type="text" name="groupname" id="groupname" size="25" />'
                  .' <span class="LC_nobreak">('
                  .$lt{'lett'}.')</span>'
         );
     } else {
-        $r->print('<input type="hidden" name="groupname" value="'.
-                         $env{'form.groupname'}.'" />'.$env{'form.groupname'});
+        $r->print(&Apache::lonhtmlcommon::row_title($lt{'gnam'})
+                 .'<input type="hidden" name="groupname" value="'
+                 .$env{'form.groupname'}.'" />'.$env{'form.groupname'});
     }
     $r->print(&Apache::lonhtmlcommon::row_closure());
 
     # Group Title
-    $r->print(&Apache::lonhtmlcommon::row_title($lt{'desc'})
-             .'<input type="text" name="description" size="40" value="" />'
+    $r->print(&Apache::lonhtmlcommon::row_title('<label for="description">'.$lt{'desc'}.'</label>')
+             .'<input type="text" name="description" id="description" size="40" value="" />'
              .&Apache::lonhtmlcommon::row_closure()
     );
 
@@ -1749,32 +1751,37 @@
              .' onclick="javascript:checkAll(document.'.$formname.'.tool)" />'
              .' <input type="button" value="'.&mt('uncheck all').'"'
              .' onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />'
-             .'</div>'
-             .'<table cellpadding="5px"><tr>' # FIXME Get rid of inflexible table (-> float)
+             .'</div><fieldset class="LC_borderless">'
+             .'<legend class="LC_visually_hidden">'.$lt{'func'}.'</legend>'
+             .'<div role="grid" class="LC_grid">'
+             .'<div role="row" class="LC_grid_row">'
     );
     for (my $i=0; $i<@allfunctions; $i++) {
-        $r->print('<td><label><span class="LC_nobreak">'
+        $r->print('<div role="gridcell" class="LC_grid_cell"><label><span class="LC_nobreak">'
                  .'<input type="checkbox" name="tool" value="'
                  .$allfunctions[$i].'" /> '
                  .&mt($$functions{$allfunctions[$i]})
-                 .'</span></label></td>'
+                 .'</span></label></div>'
         );
         if ($i == $halfnum - 1) {
-            $r->print('</tr><tr>');
+            $r->print('</div><div role="row" class="LC_grid_row">');
         }
     }
-    $r->print('</tr></table>'
+    $r->print('</div></div></fieldset>'
              .&Apache::lonhtmlcommon::row_closure()
     );
 
     # Granularity
     $r->print(&Apache::lonhtmlcommon::row_title($lt{'gran'})
+             .'<fieldset class="LC_borderless"><legend class="LC_visually_hidden">'
+             .$lt{'gran'}.'</legend>'
              .$lt{'doyo'}.'<br />'
              .'<label>'
              .'<input type="radio" name="granularity" value="Yes" />'.&mt('Yes')
              .'</label> <label>'
              .'<input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No')
              .'</label>'
+             .'</fieldset>'
     );
     if ($action eq 'modify') {
         $r->print(' <span class="LC_nobreak">('
@@ -1786,7 +1793,7 @@
     $r->print(&Apache::lonhtmlcommon::row_closure());
 
     # Disk Quota
-    $r->print(&Apache::lonhtmlcommon::row_title($lt{'dquo'}));
+    $r->print(&Apache::lonhtmlcommon::row_title('<label for="quota">'.$lt{'dquo'}.'</label>'));
     if ($action eq 'create') {
         $r->print('<span class="LC_info">'
                  .&mt('If you enable the group portfolio for the '.$gpterm
@@ -1796,7 +1803,7 @@
     } else {
         $r->print(&mt('Quota allocated to group portfolio:'));
     } 
-    $r->print(' '.&mt('[_1] MB','<input type="text" name="quota" size="4" />'));
+    $r->print(' '.&mt('[_1] MB','<input type="text" name="quota" id="quota" size="4" />'));
     if ($action eq 'create') {
         $r->print('<br />'
                  .&mt('A total of [_1] MB can be divided amongst all '.$gpterm.'s in the '
@@ -1900,9 +1907,9 @@
      <br />
      <table class="LC_status_selector">
       <tr>
-       <th>'.$lt{'acty'}.'</th>
-       <th>'.$lt{'coro'}.'</th>
-       <th>'.$lt{'cose'}.'</th>
+       <th><label for="types">'.$lt{'acty'}.'</label></th>
+       <th><label for="roles">'.$lt{'coro'}.'</label></th>
+       <th><label for="sectionpick">'.$lt{'cose'}.'</label></th>
       </tr><tr><td>');
     $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types));
     $r->print('</td><td>');
@@ -1915,14 +1922,20 @@
         @sections = ('all','none');
     }
     $r->print('</td><td>'.
-              &sections_selection(\@sections,'sectionpick').'</td>
+              &sections_selection(\@sections,'sectionpick','sectionpick').'</td>
       </tr>
      </table>');
     return;
 }
 
 sub sections_selection {
-    my ($sections,$elementname) = @_;
+    my ($sections,$elementname,$elementid,$arialabel) = @_;
+    if ($elementid ne '') {
+        $elementid = ' id="'.$elementid.'"';
+    }
+    if ($arialabel ne '') {
+        $arialabel = ' aria-label="'.$arialabel.'"';
+    }
     my $section_sel;
     my $numvisible = 4;
     if (@{$sections} < 4) {
@@ -1938,7 +1951,7 @@
         }
     }
     my $output = '
-        <select name="'.$elementname.'" multiple="multiple" size="'.$numvisible.'">
+        <select name="'.$elementname.'" multiple="multiple" size="'.$numvisible.'"'.$elementid.$arialabel.'>
           '.$section_sel.'
         </select>';
     return $output;
@@ -2184,8 +2197,9 @@
     if (keys(%members) > 0) {
         $r->print('
     <table>
-     <tr>');
+     <tr><td>');
         &check_uncheck_buttons($r,$formname,'member',$lt{'addm'});
+        $r->print('</td>');
         if (@{$available} > 0 && $granularity eq 'Yes') {
             $r->print('<td>
      <fieldset><legend>'.$lt{'setf'}.'</legend>
@@ -2222,7 +2236,7 @@
                 foreach my $tool (@{$available}) {
                     $r->print('<label><input type="checkbox" name="togglefunc" '.
    'onclick="javascript:toggleTools(document.'.$formname.'.user_'.$tool.',this);"'.
-   ' value="'.$tool.'">'.'<b>'.$tool.'</b></label>   ');
+   ' value="'.$tool.'" />'.'<b>'.$tool.'</b></label>   ');
                 }
                 $r->print('</span></td></tr>');
             }
@@ -2262,8 +2276,8 @@
                               '       ');
                     foreach my $tool (@{$available}) {
                         if ($granularity eq 'Yes') {
-                            $r->print('<input type="checkbox" name="user_'.
-                          $tool.'" value="'.$user.'" />'.$tool.'   ');
+                            $r->print('<label><input type="checkbox" name="user_'.
+                          $tool.'" value="'.$user.'" />'.$tool.'</label>   ');
                         } else {
                             $r->print('<input type="hidden" name="user_'.
                           $tool.'" value="'.$user.'" />'.$tool.'   ');
@@ -2319,6 +2333,7 @@
                 'will receive by default for a specific tool.',
       'oppr' => 'Optional privileges',
       'defp' => 'The default privileges new members will receive are:', 
+      'chec' => 'Optional privileges selection',
     );
     $lt{'plin'} = &mt('Indicate which [_1]optional[_2] privileges members '.
                       'will receive by default for a specific tool.','<b>','</b>');
@@ -2359,9 +2374,9 @@
         }
         if ($totaloptionalprivs) {
             $r->print('
-<br />
+<br /><fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.$lt{'chec'}.'</legend>
 <label><span class="LC_nobreak"><input type="radio" name="specificity" value="No" '.$specific{'No'}.' /> '.$lt{'algm'}.'</span></label><br />
-<label><span class="LC_nobreak"><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' /> '.$lt{'smgp'}.'</span></label><br /><br />');
+<label><span class="LC_nobreak"><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' /> '.$lt{'smgp'}.'</span></label></fieldset><br /><br />');
         } else {
             $r->print('<input type="hidden" name="specificity" value="No" />');
         }
@@ -2376,14 +2391,9 @@
             } else {
                 $r->print('('.&mt('if enabled below').').');
             }
-            $r->print('<br /><br />
-  <table><tr>');
-        &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});
-        $r->print('
-    </tr>
-   </table>
-   <br />
-');
+            $r->print('<br /><br />');
+            &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});
+            $r->print('<br />');
         } else {
             $r->print($lt{'algm'}.'<br /><br />');
         }
@@ -2435,7 +2445,8 @@
 	if ($dynamic ne '') {
 	    $dynamic .= '</td><td class="LC_groups_optional">';
 	}
-	$dynamic .= '<table class="LC_group_priv"><tr>';
+        $dynamic .= '<div role="grid" class="LC_grid LC_group_priv" style="margin: 0; padding: 0;">'.
+                    '<div role="row" class="LC_grid_row">';
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
             if (exists($$fixedprivs{$tool}{$priv})) {
 		if ($fixed ne '') {
@@ -2454,21 +2465,21 @@
             } else {
                 $privcount++;
                 if ($privcount == 3) {
-                    $dynamic .= '</tr>
-                                 <tr>'."\n";
+                    $dynamic .= '</div>
+                                 <div role="row" class="LC_grid_row">'."\n";
                 }
-                $dynamic .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.&mt($$toolprivs{$tool}{$priv}).'</label></span></td>'."\n";
+                $dynamic .= '<div role="gridcell" class="LC_grid_cell"><span class="LC_nobreak"><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.&mt($$toolprivs{$tool}{$priv}).'</label></span></div>'."\n";
             }
         }
         if ($privcount == 0) {
-            $dynamic .= '<td>'.&mt('None').'</td>'."\n";
+            $dynamic .= '<div role="gridcell" class="LC_grid_cell">'.&mt('None').'</div>'."\n";
         }
         if ($privcount < 3) {
-            $dynamic .= '<td> </td>'."\n";
+            $dynamic .= '<div role="gridcell" class="LC_grid_cell"> </div>'."\n";
         } elsif ($privcount%2) {
-            $dynamic = '<td> </td>'."\n";
+            $dynamic = '<div role="gridcell" class="LC_grid_cell"> </div>'."\n";
         }
-	$dynamic .= '</tr></table>';
+	$dynamic .= '</div></div>';
     }
     $r->print(&Apache::lonhtmlcommon::row_title($lt{'fixp'},undef,
 						'LC_groups_fixed').
@@ -2477,6 +2488,7 @@
     $r->print(&Apache::lonhtmlcommon::row_title($lt{'oppr'},undef,
 						'LC_groups_optional').
 	      $dynamic.
+              &Apache::lonhtmlcommon::row_closure(1).
 	      &Apache::lonhtmlcommon::end_pick_box());
     $r->print('<br />');
     return;
@@ -2625,18 +2637,28 @@
    <table>
     <tr>');
         if ($num_items->{'active'}) {
+            $r->print('<td>');
             &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
+            $r->print('</td>');
         }
         if ($num_items->{'previous'}) {
+            $r->print('<td>');
             &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
+            $r->print('</td>');
         }
         if ($num_items->{'future'}) {
+            $r->print('<td>');
             &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
+            $r->print('</td>');
         }
+        $r->print('<td>');
         &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
+        $r->print('</td>');
         if (@{$available} > 0) {
             if ($specificity eq 'Yes') {
+                $r->print('<td>');
                 &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
+                $r->print('</td>');
             }
             if ($granularity eq 'Yes') {
                 $r->print(&check_uncheck_tools($r,$available));
@@ -2800,10 +2822,9 @@
 }
 
 sub check_uncheck_buttons {
-    my ($r,$formname,$field,$title,$colspan) = @_;
+    my ($r,$formname,$field,$title) = @_;
     $r->print('
-     <td '.$colspan.'>
-       <fieldset>
+       <fieldset style="display:inline">
        <legend>'.$title.'</legend>
       <span class="LC_nobreak">
        <input type="button" value="'.&mt('check all').'"
@@ -2813,7 +2834,6 @@
        onclick="javascript:uncheckAll(document.'.$formname.'.'.$field.')" />
       </span>
        </fieldset>
-     </td>
 ');
 }
 
@@ -3081,30 +3101,18 @@
                 my $colspan = $numcells + 1;
                 my %total;
                 if (keys(%{$usertools}) > 1) {
-                    $r->print('
-   <table border="0" cellspacing="2" cellpadding="2">
-    <tr>
-');
                     foreach my $tool (@{$tools}) {
                         if (@{$showboxes{$tool}} > 0) {
-                            $r->print('<td valign="top">');
+                            $r->print('<div class="LC_floatleft">');
                             $r->print('<fieldset><legend>'.&mt($tool).'</legend>');
-                            $r->print('<table><tr>');
+                            $r->print('<div role="grid" class="LC_grid">'."\n".
+                                      '<div role="row" class="LC_grid_row">');
                             my $privcount = 0;
                             foreach my $priv (@{$showboxes{$tool}}) {
                                 $privcount ++;
-                                if (($privcount == @{$showboxes{$tool}}) && 
-                                    ($privcount > 1)) {
-                                    if ($privcount%$numcells) {
-                                        $r->print('<td colspan="'.$colspan.'">');
-                                    } else {
-                                        $r->print('<td>');
-                                    }
-                                } else {
-                                    $r->print('<td>');
-                                }
                                 $r->print(
- '<fieldset><legend>'.&mt($$toolprivs{$tool}{$priv}).'</legend>'
+'<div role="gridcell" class="LC_grid_cell">'."\n"
+.'<fieldset><legend>'.&mt($$toolprivs{$tool}{$priv}).'</legend>'
 .'<span class="LC_nobreak">'
 .' <input type="button" value="'.&mt('check all').'"'
 .' onclick="javascript:checkAll(document.'.$formname.'.userpriv_'.$priv.')" />'
@@ -3113,21 +3121,21 @@
 .' onclick="javascript:uncheckAll(document.'.$formname.'.userpriv_'.$priv.')" />'
 .'</span></fieldset><br />'
                                 );
-                                $r->print('</td>');
+                                $r->print('</div>');
                                 if ($privcount < @{$showboxes{$tool}}) {
                                     if (@{$showboxes{$tool}} > 2) {
                                         if ($privcount%$numcells == 0) {
-                                            $r->print('</tr><tr>');
+                                            $r->print('</div><div role="row" class="LC_grid_row">');
                                         }
                                     } else {
-                                        $r->print('<tr></tr>');
+                                        $r->print('</div><div role="row" class="LC_grid_row">');
                                     }
                                 }
                             }
-                            $r->print('</tr></table></fieldset></td><td> </td>');
+                            $r->print('</div></div></fieldset></div>');
                         }
                     }
-                    $r->print('</tr></table>');
+                    $r->print('<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n");
                 }
                 $r->print(&Apache::loncommon::start_data_table().
 			  &Apache::loncommon::start_data_table_header_row());
@@ -3172,15 +3180,9 @@
     my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,
                                        $ucgpterm,$crstype);
     if ($earlyout) {
-        $r->print('
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
-  <td> </td>
-  <td colspan="3">
-'.$earlyout.'</td></tr>');
+        $r->print('<div>'.$earlyout.'</div>');
         &display_navbuttons($r,$state,$$states{$action}[$page-1],
                             $$navbuttons{'gtps'});
-        $r->print('</table>');
         return;
     }
 
@@ -3687,6 +3689,8 @@
         'off' => 'off',
         'auad' => "Automatically enable $gpterm membership when roles are added?",
         'auex' => "Automatically expire $gpterm membership when roles are removed?",
+        'aadd' => 'Auto-add membership on role assignment',
+        'aexp' => 'Auto-expire membership on role revocation',
         'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.",
     );
     &automapping($r,$action,$stored,\%lt,$img1);
@@ -3707,19 +3711,21 @@
     }
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'endi'}).'
     <b>'.$$lt{'gmma'}.':</b><br />'.$$lt{'adds'}.'<br />'.$$lt{'drops'}.'<br /><br />
-   <span class="LC_nobreak">'.$$lt{'auad'}.': 
+    <fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.$lt->{'aadd'}.'</legend>
+    <span class="LC_nobreak">'.$$lt{'auad'}.': 
     <label><input type="radio" name="autoadd" value="on" />'.&mt('on').'  </label><label><input type="radio" name="autoadd" value="off" checked="checked" />'.&mt('off').'</label>');
     if ($action eq 'modify') {
         $r->print('    ('.&mt('Currently set to [_1].','<b>'.$$lt{$add}.'</b>').')');
     }
     $r->print('
-    </span><br />
+    </span></fieldset><br />
+    <fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.$lt->{'aexp'}.'</legend>
     <span class="LC_nobreak">'.$$lt{'auex'}.': 
     <label><input type="radio" name="autodrop" value="on" />'.&mt('on').'  </label><label><input type="radio" name="autodrop" value="off" checked="checked" />'.&mt('off').'</label>');
     if ($action eq 'modify') {
         $r->print('    ('.&mt('Currently set to [_1].','<b>'.$$lt{$drop}.'</b>').')');
     }
-    $r->print('</span><br /><br />'.$$lt{'mapr'});
+    $r->print('</span></fieldset><br /><br />'.$$lt{'mapr'});
 }
 
 sub mapping_settings {
@@ -3735,6 +3741,8 @@
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
     my @roles = &standard_roles($crstype);
     my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
+    $r->print('<fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.
+              $$lt{'pirs'}.'</legend>');
     $r->print(&Apache::loncommon::start_data_table().
 	      &Apache::loncommon::start_data_table_header_row());
     $r->print('
@@ -3769,30 +3777,34 @@
         }
     }
     $r->print(&Apache::loncommon::end_data_table());
+    $r->print('</fieldset>');
     return;
 }
 
 sub print_autorole_item {
     my ($role,$roletitle,$sections) = @_;
     my $sections_sel;
+    my $roleforid = $role;
+    $roleforid =~ s{/+}{_}g;
     if (@{$sections} > 0) {
         if (($role eq 'cc') || ($role eq 'co')) {
             $sections_sel = '<td align="right">'.
                             &mt('all sections').'<input type="hidden" '.
                             'name="sec_'.$role.'" value="all" /></td>';
         } else {
+            my $arialabel = &mt('Sections for automatic group enrollment for [_1]',$roletitle);
             $sections_sel='<td align="right">'.
-                          &sections_selection($sections,'sec_'.$role).
+                          &sections_selection($sections,'sec_'.$role,'',$arialabel).
                           '</td>';
         }
     }
     my $output = &Apache::loncommon::start_data_table_row().
                  '<td><input type="checkbox" '.
-                 'name="autorole" value="'.$role.'" />'.
-                 '</td><td>'.$roletitle.'</td>'.$sections_sel.
+                 'name="autorole" id="autorole_'.$roleforid.'" value="'.$role.'" />'.
+                 '</td><td><label for="autorole_'.$roleforid.'">'.$roletitle.'</label></td>'.$sections_sel.
                  &Apache::loncommon::end_data_table_row();
     return $output;
-} 
+}
 
 sub standard_roles {
     my ($crstype) = @_;
@@ -3854,22 +3866,32 @@
                 <td>'.$uname.'</td>
                 <td>'.$udom.'</td>
                 <td valign="top">
-                  <table>
-                   <tr>
-                    <td><b>'.
-                    &mt('Collaborative Tool').'</b></td>
-                   </tr>
-                   <tr>
-                    <td><b>'.&mt('Fixed').'</b></td>
-                   </tr>
-                   <tr>
-                    <td><b>'.&mt('Optional').'</b></td>
-                   </tr>
-                  </table>
-                 </td>');
+                  <div role="grid" class="LC_grid">
+                   <div role="row" class="LC_grid_row">
+                    <div role="gridcell" class="LC_grid_cell"><b>
+                    '.&mt('Collaborative Tool').'
+                    </b></div>
+                   </div>
+                   <div role="row" class="LC_grid_row"> 
+                    <div role="gridcell" class="LC_grid_cell"><b>
+                    '.&mt('Fixed').'
+                    </b></div>
+                   </div>
+                   <div role="row" class="LC_grid_row"> 
+                    <div role="gridcell" class="LC_grid_cell"><b>
+                    '.&mt('Optional').'
+                    </b></div>
+                   </div>
+                  </div>
+                </td>');
         foreach my $tool (@{$showtools}) {
             if (exists($$usertools{$user}{$tool})) {
-                $r->print('<td valign="top"><table><tr><th colspan="2">'.$tool.'</th></tr>');
+                $r->print('<td valign="top">'.
+                          '<fieldset class="LC_borderless">'.
+                          '<legend class="LC_visually_hidden">'.
+                          &mt('Additional privileges for [_1]',$$userdata{$user}[$$idx{fullname}]).
+                          '</legend>'."\n".
+                          '<table><tr><th colspan="2">'.$tool.'</th></tr>'."\n");
                 my $privcount = 0;
                 my $fixed = '';
                 my $dynamic = '';
@@ -3890,7 +3912,11 @@
                                     '</label></span></td>';
                     }
                 }
-                $r->print('<tr><td colspan="2"><span class="LC_nobreak">'.$fixed.'</span></td></tr><tr>'.$dynamic.'</tr></table></td>');
+                $r->print('<tr><td colspan="2"><span class="LC_nobreak">'.$fixed.'</span></td></tr>'."\n");
+                if ($dynamic ne '') {
+                    $r->print('<tr>'.$dynamic.'</tr>');
+                }
+                $r->print('</table></fieldset></td>');
             } else {
                 $r->print('<td valign="top"><table width="100%"><tr><th colspan="2">'.$tool.'</th></tr><tr><td> </td></tr><tr><td> </td></tr></table></td>');
             }


More information about the LON-CAPA-cvs mailing list