[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