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

raeburn raeburn at source.lon-capa.org
Tue Jan 6 11:42:02 EST 2026


raeburn		Tue Jan  6 16:42:02 2026 EDT

  Modified files:              
    /loncom/interface	courseprefs.pm lonconfigsettings.pm 
  Log:
  - WCAG compliance
    - Use <th></th> for header for each column in a data table
    - Include labels for form elements 
    - Replace use of <table> with <div> for layout
  
  
-------------- next part --------------
Index: loncom/interface/courseprefs.pm
diff -u loncom/interface/courseprefs.pm:1.137 loncom/interface/courseprefs.pm:1.138
--- loncom/interface/courseprefs.pm:1.137	Sat Dec 13 05:56:01 2025
+++ loncom/interface/courseprefs.pm	Tue Jan  6 16:42:02 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set configuration settings for a course
 #
-# $Id: courseprefs.pm,v 1.137 2025/12/13 05:56:01 raeburn Exp $
+# $Id: courseprefs.pm,v 1.138 2026/01/06 16:42:02 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -739,15 +739,15 @@
             exists $item->{'header'}->[0]->{'col2'}) {
 			$output .= '          
           	<tr class="LC_info_row">
-              <td class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>';
+              <th class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</th>';
             if ($action eq 'feedback') {
                 $output .= '
-                  <td class="LC_right_item" colspan="2">';
+                  <th class="LC_right_item" colspan="2">';
             } else {
                 $output .= '
-                  <td class="LC_right_item">';
+                  <th class="LC_right_item">';
             }
-            $output .= &mt($item->{'header'}->[0]->{'col2'}).'</td>
+            $output .= &mt($item->{'header'}->[0]->{'col2'}).'</th>
             </tr>';
         }
         $rowtotal ++;
@@ -766,15 +766,15 @@
           <td>
             <table class="LC_nested">
              <tr class="LC_info_row">
-              <td class="LC_left_item">'.&mt($item->{'header'}->[1]->{'col1'}).'</td>';
+              <th class="LC_left_item">'.&mt($item->{'header'}->[1]->{'col1'}).'</th>';
         if ($action eq 'classlists') {
             $output .= '
-              <td class="LC_right_item" colspan="2">';
+              <th class="LC_right_item" colspan="2">';
         } else {
             $output .= '
-              <td class="LC_right_item">';
+              <th class="LC_right_item">';
         }
-        $output .= &mt($item->{'header'}->[1]->{'col2'}).'</td>
+        $output .= &mt($item->{'header'}->[1]->{'col2'}).'</th>
              </tr>';
         if ($action eq 'classlists') {
             $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit).
@@ -789,8 +789,8 @@
             	exists $item->{'header'}->[2]->{'col2'}) {
 				$output .= '          
 				<tr class="LC_info_row">
-				  <td class="LC_left_item">'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
-				  <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>
+				  <th class="LC_left_item">'.&mt($item->{'header'}->[2]->{'col1'}).'</th>
+				  <th class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</th>
 				</tr>';
         	}
         }
@@ -832,14 +832,14 @@
             exists $item->{'header'}->[0]->{'col2'}) {
 	    $output .= '          
           	<tr class="LC_info_row">
-              <td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>';
+                <th class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</th>';
             if (($action eq 'courseinfo') || ($action eq 'localization') ||
                 ($action eq 'print_discussion')) {
-                $output .= '<td class="LC_right_item" valign="top" colspan="2">';
+                $output .= '<th class="LC_right_item" valign="top" colspan="2">';
             } else {
-                $output .= '<td class="LC_right_item" valign="top">';
+                $output .= '<th class="LC_right_item" valign="top">';
             }
-            $output .= &mt($item->{'header'}->[0]->{'col2'}).'</td>
+            $output .= &mt($item->{'header'}->[0]->{'col2'}).'</th>
             </tr>';
         }
     }
@@ -6173,7 +6173,7 @@
     } else {
         @ordered = ('student_classlist_view',
                     'student_classlist_opt_in',
-                     'student_classlist_portfiles');
+                    'student_classlist_portfiles');
     }
     my %lt;
 
@@ -6219,6 +6219,7 @@
                    input => 'selectbox',
                    options => \%lt,
                    order => ['disabled','all','section'],
+                   id => 'student_classlist_view',
                  },
         'student_classlist_opt_in' => {
                    text => '<b>'.&mt($itemtext->{'student_classlist_opt_in'}).'</b>',
@@ -8112,6 +8113,8 @@
             my $rowdesc;
             if ($caller eq 'appearance') {
                 $rowdesc = '<span class="LC_nobreak">'.$items->{$item}{text}.'</span>';
+            } elsif ($items->{$item}{id} ne '') {
+                $rowdesc = '<label for="'.$items->{$item}{id}.'">'.$items->{$item}{text}.'</label>';
             } else {
                 $rowdesc = $items->{$item}{text};
             }
@@ -8159,11 +8162,16 @@
                 } elsif (($item eq 'lti.topmenu') || ($item eq 'lti.inlinemenu')) {
                     $valueyes = '1';
                 }
-                $datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit);
+                $datatable .= '<fieldset class="LC_borderless"><legend class="LC_visually_hidden">'
+                             .$items->{$item}{text}.'</legend>'
+                             .&yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit)
+                             .'</fieldset>';
             } elsif ($items->{$item}{input} eq 'selectbox') {
                 my ($id,$onchange);
                 if ($caller eq 'menuitems') {
                     $id = $item;
+                } elsif ($items->{$item}{'id'} ne '') {
+                    $id = $items->{$item}{'id'};
                 } elsif ($caller eq 'grading') {
                     if ($item eq 'grading') {
                         $onchange = ' onchange="javascript:toggleGrading(this.form);"';
@@ -8281,7 +8289,8 @@
         if ($noedit) {
            $disabled = ' disabled="disabled"';
         }
-        $datatable .= '<table align="right">';
+        $datatable .= '<div class="LC_floatright" style="margin: 0; padding: 0;">'.
+                      '<div role="grid" class="LC_grid" style="margin:0; padding: 1px;">';
         foreach my $user (sort(@privusers)) {
             my $hideon = ' checked="checked" ';
             my $hideoff = '';
@@ -8290,19 +8299,24 @@
                 $hideon = '';
             }
             my ($uname,$udom) = split(':',$user);
-            $datatable .=  '<tr><td align="left">'.
-                           &Apache::loncommon::aboutmewrapper(
-                           &Apache::loncommon::plainname($uname,$udom,'firstname'),
-                           $uname,$udom,'aboutuser').
-                          '</td><td align="left">'.
+            $datatable .= '<div role="row" class="LC_grid_row">'.
+                          '<div role="gridcell" class="LC_grid_cell">'.
+                          &Apache::loncommon::aboutmewrapper(
+                          &Apache::loncommon::plainname($uname,$udom,'firstname'),
+                          $uname,$udom,'aboutuser').
+                          '</div><div role="gridcell" class="LC_grid_cell">'.
+                          '<fieldset class="LC_borderless"><legend class="LC_visually_hidden">'.
+                          &mt('[_1] in listing?',
+                              &Apache::loncommon::plainname($uname,$udom,'firstname')).
+                          '</legend>'.
                           '<span class="LC_nobreak"><label>'.
                           '<input type="radio" name="'.$item.'_'.$user.'"'.
                           $hideon.' value=""'.$disabled.' />'.&mt('Hidden').'</label> '.
                           '<label><input type="radio" name="'.$item.'_'.$user.'"'.
-                          $hideoff.' value="yes"'.$disabled.' />'.&mt('Shown').'</label></span></td>'.
-                          '</tr>';
+                          $hideoff.' value="yes"'.$disabled.' />'.&mt('Shown').'</label></span>'.
+                          '</fieldset></div></div>';
         }
-        $datatable .= '</table>';
+        $datatable .= '</div></div>';
     } else {
         if ($crstype eq 'Community') {
             $datatable .= &mt('No Domain Coordinators have community roles');
@@ -8325,15 +8339,18 @@
     my @excdoms = ($cdom);
     my $num = 0;
     if ($settings->{$item} eq '') {
-        $datatable = '</td><td align="right">'.
-                     &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,
+        my $elemname = 'checkforpriv_'.$num;
+        $datatable = '</td><td align="right"><label for="'.$elemname.'" class="LC_visually_hidden">'.
+                     &mt('Other domains').'</label>'.
+                     &Apache::loncommon::select_dom_form('',$elemname,
                                                          1,1,undef,undef,\@excdoms,
-                                                         $noedit);
+                                                         $noedit,$elemname);
     } else {
         my @privdoms = split(/,/,$settings->{$item});
         my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();
-        $datatable = '</td><td align="right"><br />'.
-                     &Apache::loncommon::start_data_table();
+        $datatable = '</td><td align="right">'.
+                     '<div class="LC_floatright" style="margin: 0; padding: 0;">'.
+                     '<div role="grid" class="LC_grid" style="margin:0; padding: 1px;">';
         my $disabled;
         if ($noedit) {
             $disabled = ' disabled="disabled"';
@@ -8346,15 +8363,16 @@
                     $domdesc = $currdom;
                 }
                 $datatable .=
-                    &Apache::loncommon::start_data_table_row().
-                    '<td align="left"><span class="LC_nobreak">'.
-                    &mt('Domain:').'<b> '.$domdesc.
-                    '</b><input type="hidden" name="checkforpriv_'.$num.
-                    '" value="'.$currdom.'" /></span><br />'.
+                    '<div role="row" class="LC_grid_row">'.
+                    '<div role="gridcell" class="LC_grid_cell" style="margin:0; padding:0">'.
+                    '<fieldset>'.
+                    '<legend>'.$domdesc.'</legend>'.
+                    '<input type="hidden" name="checkforpriv_'.$num.
+                    '" value="'.$currdom.'" />'.
                     '<span class="LC_nobreak"><label><input type="checkbox" '.
                     'name="checkforpriv_delete" value="'.$num.'"'.$disabled.' />'.
-                    &mt('Delete').'</label></span></td>'.
-                    &Apache::loncommon::end_data_table_row();
+                    &mt('Delete').'</label></span></fieldset></div>'.
+                    '</div>';
                 $num ++;
                 unless (grep(/^\Q$currdom\E$/, at excdoms)) {
                     push(@excdoms,$currdom);
@@ -8363,14 +8381,16 @@
         }
         if ((scalar(keys(%domains)) - scalar(@excdoms)) > 0) {
             $datatable .=
-                &Apache::loncommon::start_data_table_row().
-                '<td align="left"><span class="LC_nobreak">'.
-                &mt('Additional domain:'). '</span><br />'.
+                '<div role="row" class="LC_grid_row">'.
+                '<div role="gridcell" class="LC_grid_cell" style="margin:0; padding:0">'.
+                '<fieldset><legend><label for="checkforpriv_'.$num.'">'.
+                &mt('Additional domain').'</label></legend>'.
                 &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1,
-                                                    1,undef,undef,\@excdoms,$noedit).
-                '</td>'.&Apache::loncommon::end_data_table_row();
+                                                    1,undef,undef,\@excdoms,$noedit,
+                                                    'checkforpriv_'.$num).
+                '</fieldset></div></div>';
         }
-        $datatable .= &Apache::loncommon::end_data_table().
+        $datatable .= '</div></div>'.
                       '<input type="hidden" name="checkforpriv_total" value="'.$num.'" />'.
                       '<br />';
     }
Index: loncom/interface/lonconfigsettings.pm
diff -u loncom/interface/lonconfigsettings.pm:1.79 loncom/interface/lonconfigsettings.pm:1.80
--- loncom/interface/lonconfigsettings.pm:1.79	Wed Dec 24 02:34:27 2025
+++ loncom/interface/lonconfigsettings.pm	Tue Jan  6 16:42:02 2026
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: lonconfigsettings.pm,v 1.79 2025/12/24 02:34:27 raeburn Exp $
+# $Id: lonconfigsettings.pm,v 1.80 2026/01/06 16:42:02 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -797,8 +797,10 @@
     }
     if ($container) {
         &Apache::lonparmset::endSettingsScreen($r);
+    } else {
+        $r->print('</div>');
     }
-    $r->print('</div>'.&Apache::loncommon::end_page());
+    $r->print(&Apache::loncommon::end_page());
     return;
 }
 


More information about the LON-CAPA-cvs mailing list