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

raeburn raeburn at source.lon-capa.org
Fri Jan 30 12:18:01 EST 2026


raeburn		Fri Jan 30 17:18:01 2026 EDT

  Modified files:              
    /loncom/interface	loncoursegroups.pm 
  Log:
  - WCAG 2 compliance
    - Replace use of <table> with <div> for layout
    - Group form elements in fieldset with legend for screenreaders
    - Satisfy minimum size for touch targets
  
  
-------------- next part --------------
Index: loncom/interface/loncoursegroups.pm
diff -u loncom/interface/loncoursegroups.pm:1.137 loncom/interface/loncoursegroups.pm:1.138
--- loncom/interface/loncoursegroups.pm:1.137	Wed Jan 21 20:53:31 2026
+++ loncom/interface/loncoursegroups.pm	Fri Jan 30 17:18:01 2026
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: loncoursegroups.pm,v 1.137 2026/01/21 20:53:31 raeburn Exp $
+# $Id: loncoursegroups.pm,v 1.138 2026/01/30 17:18:01 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1781,16 +1781,15 @@
              .'</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">('
+        $r->print('   <span class="LC_nobreak">('
                  .&mt('Currently set to [_1].'
                      ,'"'.&mt($$stored{'granularity'}).'"')
                  .')</span>'
         );
     }
-    $r->print(&Apache::lonhtmlcommon::row_closure());
+    $r->print('</fieldset>'.&Apache::lonhtmlcommon::row_closure());
 
     # Disk Quota
     $r->print(&Apache::lonhtmlcommon::row_title('<label for="quota">'.$lt{'dquo'}.'</label>'));
@@ -2331,7 +2330,6 @@
       'asyo' => "As you have chosen not to include any collaborative tools ".
                 "in the group, no default optional privileges need to be set.",
                 'will receive by default for a specific tool.',
-      'oppr' => 'Optional privileges',
       'defp' => 'The default privileges new members will receive are:', 
       'chec' => 'Optional privileges selection',
     );
@@ -2375,8 +2373,8 @@
         if ($totaloptionalprivs) {
             $r->print('
 <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></fieldset><br /><br />');
+<div class="LC_touch_target"><label><span class="LC_nobreak"><input type="radio" name="specificity" value="No" '.$specific{'No'}.' /> '.$lt{'algm'}.'</span></label></div>
+<div class="LC_touch_target"><label><span class="LC_nobreak"><input type="radio" name="specificity" value="Yes" '.$specific{'Yes'}.' /> '.$lt{'smgp'}.'</span></label></fieldset></div><br />');
         } else {
             $r->print('<input type="hidden" name="specificity" value="No" />');
         }
@@ -2392,7 +2390,8 @@
                 $r->print('('.&mt('if enabled below').').');
             }
             $r->print('<br /><br />');
-            &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'});
+            my $oprv = &mt('Optional Privileges');
+            &check_uncheck_buttons($r,$formname,'defpriv',$oprv);
             $r->print('<br />');
         } else {
             $r->print($lt{'algm'}.'<br /><br />');
@@ -2445,8 +2444,8 @@
 	if ($dynamic ne '') {
 	    $dynamic .= '</td><td class="LC_groups_optional">';
 	}
-        $dynamic .= '<div role="grid" class="LC_grid LC_group_priv" style="margin: 0; padding: 0;">'.
-                    '<div role="row" class="LC_grid_row">';
+        my $dynitems = '<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 '') {
@@ -2456,30 +2455,37 @@
                          .'<span class="LC_nobreak">'.&mt($$toolprivs{$tool}{$priv}).' ';
                 if ($action eq 'modify') {
                     if (grep(/^$tool$/,@{$available})) {
-                        $fixed .= '<small>'.&mt('(on)').'<small> ';
+                        $fixed .= '<span class="LC_fontsize_medium">'.&mt('(on)').'</span> ';
                     } else {
-                        $fixed .= '<small>'.&mt('(off)').'<small> ';
+                        $fixed .= '<span class="LC_fontsize_medium">'.&mt('(off)').'</span> ';
                     }
                 }
                 $fixed .= '</span>';
             } else {
                 $privcount++;
                 if ($privcount == 3) {
-                    $dynamic .= '</div>
-                                 <div role="row" class="LC_grid_row">'."\n";
+                    $dynitems .= '</div>
+                                  <div role="row" class="LC_grid_row">'."\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";
+                $dynitems .= '<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 .= '<div role="gridcell" class="LC_grid_cell">'.&mt('None').'</div>'."\n";
+            $dynitems .= '<div role="gridcell" class="LC_grid_cell">'.&mt('None').'</div>'."\n";
         }
         if ($privcount < 3) {
-            $dynamic .= '<div role="gridcell" class="LC_grid_cell"> </div>'."\n";
+            $dynitems .= '<div role="gridcell" class="LC_grid_cell"> </div>'."\n";
         } elsif ($privcount%2) {
-            $dynamic = '<div role="gridcell" class="LC_grid_cell"> </div>'."\n";
+            $dynitems .= '<div role="gridcell" class="LC_grid_cell"> </div>'."\n";
+        }
+        $dynitems .= '</div></div>';
+        if ($privcount) {
+            $dynamic .= '<fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.
+                        &mt('Optional privileges for '.$functions->{$tool}).'</legend>'.
+                        $dynitems.'</fieldset>';
+        } else {
+            $dynamic .= $dynitems;
         }
-	$dynamic .= '</div></div>';
     }
     $r->print(&Apache::lonhtmlcommon::row_title($lt{'fixp'},undef,
 						'LC_groups_fixed').
@@ -2633,53 +2639,49 @@
                                             $available);
     my $numcurrent = scalar(keys(%{$current}));
     if ($numcurrent > 0) {
-        $r->print('
-   <table>
-    <tr>');
         if ($num_items->{'active'}) {
-            $r->print('<td>');
+            $r->print('<div class="LC_floatleft">');
             &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
-            $r->print('</td>');
+            $r->print('</div>');
         }
         if ($num_items->{'previous'}) {
-            $r->print('<td>');
+            $r->print('<div class="LC_floatleft">');
             &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
-            $r->print('</td>');
+            $r->print('</div>');
         }
         if ($num_items->{'future'}) {
-            $r->print('<td>');
+            $r->print('<div class="LC_floatleft">');
             &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
-            $r->print('</td>');
+            $r->print('</div>');
         }
-        $r->print('<td>');
+        $r->print('<div class="LC_floatleft">');
         &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
-        $r->print('</td>');
+        $r->print('</div>');
         if (@{$available} > 0) {
             if ($specificity eq 'Yes') {
-                $r->print('<td>');
+                $r->print('<div class="LC_floatleft">');
                 &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
-                $r->print('</td>');
+                $r->print('</div>');
             }
             if ($granularity eq 'Yes') {
                 $r->print(&check_uncheck_tools($r,$available));
                 $r->print('
-     <td>
+    <div class="LC_floatleft">
+     <fieldset><legend>'.$lt{'curf'}.'</legend>
       <span class="LC_nobreak">
-       <fieldset><legend>'.$lt{'curf'}.'</legend>
        <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAllTools(document.'.$formname.')" />
          
        <input type="button" value="'.&mt('uncheck all').'"
         onclick="javascript:uncheckAllTools(document.'.$formname.')" />
-      </fieldset>
-     </span>
-    </td>
+      </span>
+     </fieldset>
+    </div>
 ');
             }
         }
         $r->print(<<"END");
-   </tr>
-  </table>
+  <div style="padding:0;clear:both;margin:0;border:0"></div>
   <br />
 END
         $r->print(&Apache::loncommon::start_data_table().
@@ -2707,14 +2709,15 @@
             if ($granularity eq 'Yes') {
                 $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
  <td colspan="7"> </td>
- <td colspan="'.$colspan.'" align="center"><span class="LC_nobreak"><b>'.&mt('All:').
-  '</b> ');
+ <td colspan="'.$colspan.'" align="center">
+ <fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.&mt('Apply tool setting to all listed members').'</legend>
+ <span class="LC_nobreak"><b>'.&mt('All:').'</b> ');
                 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>   ');
                 }
-                $r->print('</span></td></tr>');
+                $r->print('</span></fieldset></td></tr>');
             }
         }
         my %Sortby = ();
@@ -2740,7 +2743,10 @@
                 my $start = $$current{$user}{start};
                 my $end = $$current{$user}{end};
                 $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').'
-                            <td>');
+                          <td><fieldset class="LC_borderless"><legend class="LC_visually_hidden">
+                          '.&mt('Actions for [_1]',$fullname).'
+                          </legend>'
+                );
                 if ($$current{$user}{changestate} eq 'reenable') {
                     $r->print('<span class="LC_nobreak"><label>'. 
    '<input type="checkbox" name="reenable" value="'.$user.'" />'.
@@ -2763,16 +2769,21 @@
    '</label></span>');
                 }
                 $r->print('
-   </td>'.
+   </fieldset></td>'.
    '<td>'.$fullname.'</td>'.
    '<td>'.$uname.'</td>'.
-   '<td>'. $udom.'</td>'.
+   '<td>'.$udom.'</td>'.
    '<td>'.$id.'</td>'.
    '<td>'.$start.'</td>'.
    '<td>'.$end.'</td>');
                 if ($hastools) {
-                    $r->print('<td align="left"><span class="LC_nobreak">'.
+                    $r->print('<td align="left">');
+                    if ($granularity eq 'Yes') {
+                        $r->print('<fieldset class="LC_borderless">'.
+                                  '<legend class="LC_visually_hidden">'.&mt('Current tools for [_1]',$fullname).'</legend>'.
+                                  '<span class="LC_nobreak">'.
                                   '      ');
+                    }
                     foreach my $tool (@{$$current{$user}{currtools}}) {
                         if ($granularity eq 'Yes') {
                             $r->print('<label><input type="checkbox" '. 
@@ -2787,17 +2798,24 @@
                          }
                          $r->print('   ');
                     }
-                    $r->print('</span></td>');
+                    $r->print('</span>');
+                    if ($granularity eq 'Yes') {
+                        $r->print('</fieldset>');
+                    }
+		    $r->print('</td>');
                 }
                 if ($addtools) {
                     $r->print('<td align="left">');
                     if ($granularity eq 'Yes') {
+                        $r->print('<fieldset class="LC_borderless">'.
+                                  '<legend class="LC_visually_hidden">'.&mt('Additional tools for [_1]',$fullname).'</legend>');
                         foreach my $tool (@{$$current{$user}{newtools}}) {
                             $r->print('<span class="LC_nobreak"><label><input type="checkbox"
                                           name="user_'.$tool.'" value="'.
                                           $user.'" />'.$tool.
                                           '</label></span>   ');
                         }
+                        $r->print('</fieldset>');
                     } else {
                         foreach my $tool (@{$$current{$user}{newtools}}) {
                             $r->print('<span class="LC_nobreak"><input type="hidden" 


More information about the LON-CAPA-cvs mailing list