[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm lonhtmlcommon.pm lonparmset.pm
raeburn
raeburn at source.lon-capa.org
Mon Apr 27 22:36:03 EDT 2026
raeburn Tue Apr 28 02:36:03 2026 EDT
Modified files:
/loncom/interface lonparmset.pm loncommon.pm lonhtmlcommon.pm
Log:
- WCAG 2.2 compliance
- Include labels for form elements.
- Satisfy minimum spacing between touch targets.
- Use <th> tags for column headings and row headings in data table
with scope="row" attribute for latter.
- For form elements in data table cells use aria-labelledby to reference
appropriate column and row headers.
- Group form elements in fieldset with legend for screenreaders.
- Contrast ratio of at least 4.5:1 for normal text.
- Replace use of <table> with <div> for layout.
- Sequential headings.
-------------- next part --------------
Index: loncom/interface/lonparmset.pm
diff -u loncom/interface/lonparmset.pm:1.635 loncom/interface/lonparmset.pm:1.636
--- loncom/interface/lonparmset.pm:1.635 Mon Apr 27 03:56:16 2026
+++ loncom/interface/lonparmset.pm Tue Apr 28 02:36:03 2026
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.635 2026/04/27 03:56:16 raeburn Exp $
+# $Id: lonparmset.pm,v 1.636 2026/04/28 02:36:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -686,20 +686,23 @@
# @param {integer} $checkdate - the date to check.
# @returns {string} - HTML possibly containing a localized warning message.
sub date_sanity_info {
- my $checkdate=shift;
+ my ($checkdate,$css_class) = @_;
unless ($checkdate) { return ''; }
my $result='';
+ if ($css_class eq '') {
+ $css_class = 'LC_warning';
+ }
my $crsprefix='course.'.$env{'request.course.id'}.'.';
if ($env{$crsprefix.'default_enrollment_end_date'}) {
if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
- $result.='<div class="LC_warning">'
+ $result.='<div class="'.$css_class.'" style="margin-bottom: 0;">'
.&mt('After course enrollment end!')
.'</div>';
}
}
if ($env{$crsprefix.'default_enrollment_start_date'}) {
if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
- $result.='<div class="LC_warning">'
+ $result.='<div class="'.$css_class.'" style="margin-bottom: 0;">'
.&mt('Before course enrollment start!')
.'</div>';
}
@@ -971,25 +974,58 @@
}
-# Returns HTML with the value of the given parameter,
-# using a readable format for dates, and
-# a warning if there is a problem with a date.
+# Returns either a scalar, or an array when called in array context.
+#
+# In an array first element contains HTML with the value of the given parameter,
+# using a readable format for dates, and the second element contains HTML for a
+# warning if there is a problem with a date.
+#
+# In scalar context, the two pieces of HTML (value and warning) are concatenated
+# into a single string, which is then returned.
+#
# Used by table mode.
# Returns HTML for the editmap.png image if no value is defined and $editable is true.
#
# @param {string} $value - the parameter value
# @param {string} $type - the parameter type
-# @param {boolean} $editable - Set to true to get an icon when no value is defined.
+# @param {boolean} $editable - Set to true to get an icon when no value is defined
+# @param {string} $parmname - short name of parameter (optional)
+# @param {string} $parmlev - numerical parameter level between 1 and 18 (optional)
+# @param {string} $alertclass - CSS class for warning included when
+# there is a problem with a date (optional).
sub valout {
- my ($value,$type,$editable)=@_;
+ my ($value,$type,$editable,$parmname,$parmlev,$alertclass)=@_;
my $result = '';
+ my $alert = '';
# Values of zero are valid.
if (! $value && $value ne '0') {
if ($editable) {
+ my %levels = &Apache::lonlocal::texthash (
+ 18 => 'General course',
+ 17 => 'Map or Folder level in course (recursive)',
+ 16 => 'Map or Folder level in course (non-recursive)',
+ 15 => 'Resource default',
+ 14 => 'Map default',
+ 13 => 'Resource level in course',
+ 12 => 'General for section',
+ 11 => 'Map or Folder level for section (recursive)',
+ 10 => 'Map or Folder level for section (non-recursive)',
+ 9 => 'Resource level in section',
+ 8 => 'General for group',
+ 7 => 'Map or Folder level for group (recursive)',
+ 6 => 'Map or Folder level for group (non-recursive)',
+ 5 => 'Resource level in group',
+ 4 => 'General for specific student',
+ 3 => 'Map or Folder level for specific student (recursive)',
+ 2 => 'Map or Folder level for specific student (non-recursive)',
+ 1 => 'Resource level for specific student',
+ );
$result =
'<img src="/res/adm/pages/editmap.png"'
.' alt="'.&mt('Change').'"'
- .' title="'.&mt('Change').'" style="border:0;" />';
+ .' title="'
+ .&mt('Set \'[_1]\' -- [_2]',$parmname,$levels{$parmlev})
+ .'" style="border:0;" />';
} else {
$result=' ';
}
@@ -1037,15 +1073,19 @@
}
}
} elsif (&isdateparm($type)) {
- $result = &Apache::lonlocal::locallocaltime($value).
- &date_sanity_info($value);
+ $result = &Apache::lonlocal::locallocaltime($value);
+ $alert = &date_sanity_info($value,$alertclass);
} else {
$result = $value;
$result=~s/\,/\, /gs;
$result = &HTML::Entities::encode($result,'"<>&');
}
}
- return $result;
+ if (wantarray) {
+ return ($result,$alert);
+ } else {
+ return $result.$alert;
+ }
}
sub interval_to_humanstr {
@@ -1133,21 +1173,30 @@
}
}
my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
+ my @extra;
+ if ($value eq '') {
+ my $parmlev = (split(/\&/,$marker))[2];
+ @extra = ($parmname,$parmlev);
+ }
my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
unless (defined($winvalue)) { $winvalue=$val; }
- my $valout = &valout($value,$type,1);
+ my ($valout,$alert) = &valout($value,$type,1, at extra);
my $unencmarker = $marker;
foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
\$hour, \$min, \$sec, \$extra) {
$$item = &HTML::Entities::encode($$item,'"<>&');
$$item =~ s/\'/\\\'/g;
}
- return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$unencmarker.'" /></td></tr><tr><td align="center">'.
- '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
- .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."','".$extra."'".');">'.
- $valout.'</a></td></tr>'.($recursive?'<tr><td align="center" class="LC_parm_recursive">'.
- &mt('recursive').'</td></tr>' : '').'</table>';
-
+ my $valsty;
+ unless ($alert || $recursive) {
+ $valsty = ' style="line-height: 180%;"';
+ }
+ return '<span'.$valsty.'><a name="'.$unencmarker.'" />'
+ .'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
+ .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."','".$extra."'".');">'
+ .$valout.'</a></span>'.$alert.($recursive?'<br style="line-height: 50%;"/>'
+ .'<span class="LC_parm_recursive">'
+ .&mt('recursive').'</span>' : '');
}
# Javascript for table mode.
@@ -1958,7 +2007,7 @@
$advice = &mt('Use Resource Assembly Tool to set this.');
}
}
- $parm .= '<br /><span class="LC_fontsize_small LC_cusr_emph">'.$advice.'</span>';
+ $parm .= '<br /><span class="LC_fontsize_medium LC_cusr_emph">'.$advice.'</span>';
}
$r->print('<td>'.$parm.'</td>');
@@ -2154,8 +2203,8 @@
}
my ($parmname)=($thismarker=~/\_([^\_]+)$/);
$effective_parm = &valout($recursinfo->[0],$recursinfo->[1]);
- $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.
- '<br /><span class="LC_parm_recursive">'.$rectitle.' '.
+ $r->print('<td style="background-color:#D6D6FF;" align="center">'.$effective_parm.
+ '<br style="line-height: 50%;" /><span class="LC_parm_recursive">'.$rectitle.' '.
$effparm_level.'</span></td>');
} else {
if ($result) {
@@ -2164,9 +2213,10 @@
if ($eff_groupparm) {
$effective_parm = $eff_groupparm;
}
- $r->print('<td style="background-color:#CCCCFF;" align="center">'.$effective_parm.
- ($effparm_rec?'<br /><span class="LC_parm_recursive">'.&mt('recursive').
- '</span>':'').'</td>');
+ $r->print('<td style="background-color:#D6D6FF;" align="center">'.$effective_parm.
+ ($effparm_rec?'<br style="line-height: 50%;" />'
+ .'<span class="LC_parm_recursive">'.&mt('recursive')
+ .'</span>':'').'</td>');
}
if ($parmlev eq 'full') {
my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
@@ -2175,8 +2225,8 @@
if (!defined($sessionvaltype)) {
$sessionvaltype=$$defaulttype{$which};
}
- $r->print('<td style="background-color:#999999;" align="center"><font color="#FFFFFF">'.
- &valout($sessionval,$sessionvaltype).' '.
+ $r->print('<td style="background-color:#707070;" align="center"><font color="#FFFFFF">'.
+ &valout($sessionval,$sessionvaltype,'','','','LC_session_parm_alert').' '.
'</font></td>');
}
$r->print('</tr>');
@@ -2254,7 +2304,6 @@
}
}
if ($nolink) {
- my ($parmname)=((split(/\&/,$mprefix))[1]=~/\_([^\_]+)$/);
$r->print(&valout($currval,$currtype));
} else {
$r->print(&plink($currtype,
@@ -2796,8 +2845,8 @@
foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {
next if (@{$categoryList{$key}} == 0);
next if ($key eq '');
- $r->print('<div class="LC_Box LC_400Box">'
- .'<h4 class="LC_hcell">'.&mt($categories{$key}).'</h4>'."\n");
+ $r->print('<div class="LC_Box LC_400Box" style="line-height: 185%;">'
+ .'<h3 class="LC_hcell LC_heading_3">'.&mt($categories{$key}).'</h3>'."\n");
foreach my $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
next if ($tempkey eq '');
$r->print('<span class="LC_nobreak">'
@@ -2864,7 +2913,7 @@
$selsize = 8;
}
- $r->print('<select multiple="multiple" name="psprt" size="'.$selsize.'">');
+ $r->print('<select multiple="multiple" name="psprt" size="'.$selsize.'" id="psprt">');
$r->print('<option value="all"');
$r->print(' selected="selected"') unless (@{$psprt}); # useless, the array is never empty
$r->print('>'.&mt('All Parts').'</option>');
@@ -2898,7 +2947,7 @@
# @param {string} $pssymb - resource symb (when a single resource is selected)
sub usermenu {
my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_;
- my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
+ my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom','','','','','','','udom').' '.
&Apache::loncommon::selectstudent_link('parmform','uname','udom','condition').
&Apache::lonhtmlcommon::scripttag(<<ENDJS);
function setCourseadv(form,caller) {
@@ -2924,12 +2973,17 @@
} else {
$stuonly = &mt('student only');
}
- $chooseopt .= '<br /><span class="LC_cusr_subheading">'.
- &mt("User's role").': '.
+ $chooseopt .= '<br />'.
+ '<fieldset class="LC_borderless" style="margin-top: 6px;">'.
+ '<legend class="LC_visually_hidden">'.&mt("User's role").'</legend>'.
+ '<span class="LC_cusr_subheading">'.
+ '<span aria-hidden="true">'.
+ &mt("User's role").': </span>'.
'<label><input type="radio" name="userroles" value="st"'.$chkroles{'st'}.' onclick="setCourseadv(this.form,this);" />'.
$stuonly.'</label> '.
'<label><input type="radio" name="userroles" value="any"'.$chkroles{'any'}.' onclick="setCourseadv(this.form,this);" />'.
- &mt('any role').'</label><input type="hidden" id="courseadv" name="courseadv" value="'.$courseadv.'" /></span>';
+ &mt('any role').'</label><input type="hidden" id="courseadv" name="courseadv" value="'.$courseadv.'" /></span>'.
+ '</fieldset>';
my $sections='';
my %sectionhash = &Apache::loncommon::get_sections();
@@ -2951,7 +3005,7 @@
$sections .= ';'.(' ' x2);
}
} elsif (%sectionhash && $currsec eq '') {
- $sections=&mt('Section:').' <select name="csec"';
+ $sections='<label>'.&mt('Section:').' <select name="csec"';
if (%grouphash && $parmlev ne 'full') {
$sections .= qq| onchange="group_or_section('csec')" |;
}
@@ -2961,7 +3015,7 @@
($section eq $csec?'selected="selected"':'').'>'.$section.
'</option>';
}
- $sections.='</select>';
+ $sections.='</select></label>';
}
if (%sectionhash && %grouphash && $parmlev ne 'full' && $currsec eq '') {
@@ -2996,7 +3050,7 @@
}
if (%grouphash) {
- $groups=&mt('Group').': <select name="cgroup"';
+ $groups='<label>'.&mt('Group').': <select name="cgroup"';
if (%sectionhash && $env{'form.action'} eq 'settable' && $currsec eq '') {
$groups .= qq| onchange="group_or_section('cgroup')" |;
}
@@ -3016,7 +3070,7 @@
}
$groups .= '>'.$grp.'</option>';
}
- $groups.='</select>';
+ $groups.='</select></label>';
}
if (%sectionhash || %grouphash) {
@@ -3028,10 +3082,12 @@
}
$r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));
- $r->print(&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
- ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'
- ,'<input type="text" value="'.$id.'" size="12" name="id" /> '
- ,$chooseopt));
+ $r->print(&mt('For [_1]User [_2] or [_1]Student/Employee ID [_3] at [_4]Domain [_5]'
+ ,'<label>',
+ ,'<input type="text" value="'.$uname.'" size="12" name="uname" /></label>'
+ ,'<input type="text" value="'.$id.'" size="12" name="id" /></label> '
+ ,'<label for="udom">'
+ ,'</label>'.$chooseopt));
}
# Prints HTML to select parameters from a list of all parameters.
@@ -3138,7 +3194,14 @@
);
$r->print(&Apache::loncommon::start_scrollbox('700px','680px','400px','mapmenuscroll'));
+ $r->print('<fieldset class="LC_borderless">'
+ .'<legend class="LC_visually_hidden">'
+ .&mt('Select Enclosing Map or Folder')
+ .'</legend>');
$r->print(&Apache::loncommon::start_data_table(undef,'mapmenuinner'));
+ $r->print(&Apache::loncommon::start_data_table_header_row('LC_visually_hidden')
+ .'<th>'.&mt('Folders').'</th>'
+ .&Apache::loncommon::end_data_table_header_row()."\n");
# Display row: "All Maps or Folders"
$r->print(
@@ -3194,12 +3257,12 @@
$r->print(
&Apache::loncommon::start_data_table_row()
.'<td>'
- .'<label>'
);
# Only offer radio button for folders/maps which can be parameterized
if ($allmaps_inverted{$symb_name}) {
$r->print(
- '<input type ="radio" name="pschp"'
+ '<label>'
+ .'<input type ="radio" name="pschp"'
.' value="'.$allmaps_inverted{$symb_name}.'"'
);
$r->print(' checked="checked"') if ($allmaps_inverted{$symb_name} eq $pschp);
@@ -3210,15 +3273,19 @@
$r->print(
$indent.$icon.' '
.$treeinfo->{$id}->{name}
- .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':'')
- .'</label>'
- .'</td>'
+ .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':''));
+ if ($allmaps_inverted{$symb_name}) {
+ $r->print('</label>');
+ }
+ $r->print(
+ '</td>'
.&Apache::loncommon::end_data_table_row()
);
}
$r->print(&Apache::loncommon::end_data_table().
- '<br style="line-height:2px;" />'.
+ '</fieldset>'.
+ '<br style="line-height: 2px;" />'.
&Apache::loncommon::end_scrollbox());
}
}
@@ -3232,7 +3299,7 @@
sub levelmenu {
my ($r,$alllevs,$parmlev)=@_;
- $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').
+ $r->print(&Apache::lonhtmlcommon::row_title('<label for="parmlev">'.&mt('Select Parameter Level').'</label>'.
&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
$r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');
foreach my $lev (reverse(sort(keys(%{$alllevs})))) {
@@ -3264,7 +3331,7 @@
} else {
@possibles = ('all',sort(keys(%sectionhash)));
}
- my $output = '<select name="Section" multiple="multiple" size="8"'.$disabled.'>';
+ my $output = '<select name="Section" id="Section" multiple="multiple" size="8"'.$disabled.'>';
foreach my $s (@possibles) {
$output .= ' <option value="'.$s.'"';
if ((@{$selectedsections}) && (grep(/^\Q$s\E$/,@{$selectedsections}))) {
@@ -3291,7 +3358,7 @@
}
return '' if (!%grouphash);
- my $output = '<select name="Group" multiple="multiple" size="8">';
+ my $output = '<select name="Group" id="Group" multiple="multiple" size="8">';
foreach my $group (sort(keys(%grouphash))) {
$output .= ' <option value="'.$group.'"';
if ((@{$selectedgroups}) && (grep(/^\Q$group\E$/,\@{$selectedgroups}))) {
@@ -3386,10 +3453,15 @@
$sortchecked{'studentrealm'} = $sortchecked{'realmstudent'};
$sortchecked{'realmstudent'} = '';
}
+ $r->print('<fieldset class="LC_wcag" style="line-height: 185%"><legend>'.&mt('Sort order').'</legend>');
foreach my $sorttype ('realmstudent','studentrealm') {
- $r->print('<br /><label><input type="radio" name="sortorder" value="'.$sorttype.'"'.$sortchecked{$sorttype}.' />'.
+ $r->print('<label><input type="radio" name="sortorder" value="'.$sorttype.'"'.$sortchecked{$sorttype}.' />'.
$text{$sorttype}.'</label>');
+ if ($sorttype eq 'realmstudent') {
+ $r->print('<br />');
+ }
}
+ $r->print('</fieldset>');
}
# Returns a hash parameter key -> order (integer) giving the order for some parameters.
@@ -3974,7 +4046,7 @@
}
# Step 1
- $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'),'parmstep1'));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'),'parmstep1','h2','LC_heading_3'));
$r->print('
<script type="text/javascript">
// <![CDATA['.
@@ -3987,17 +4059,17 @@
$r->print(&Apache::lonhtmlcommon::row_closure());
&mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
$r->print(&Apache::lonhtmlcommon::row_closure());
- $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
+ $r->print(&Apache::lonhtmlcommon::row_title('<label for="psprt">'.&mt('Select Parts to View').'</label>'));
&partmenu($r,\%allparts,\@psprt);
$r->print(&Apache::lonhtmlcommon::row_closure(1));
$r->print(&Apache::lonhtmlcommon::end_pick_box());
# Step 2
- $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2','h2','LC_heading_3'));
&displaymenu($r,\%allparms,\@pscat,\%keyorder,'parmmenuscroll');
# Step 3
- $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3','h2','LC_heading_3'));
$r->print(&Apache::lonhtmlcommon::start_pick_box());
&usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
$r->print(&Apache::lonhtmlcommon::row_closure(1));
@@ -4044,7 +4116,7 @@
$title,'<span class="LC_filename">'.$resource.'</span>').
'<input type="hidden" value="'.$pssymb.'" name="symb" />'.
'<br />');
- $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
+ $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)'),'','h2','LC_heading_3'));
$r->print(&Apache::lonhtmlcommon::start_pick_box());
foreach my $item (keys(%allparts)) {
if ($item =~ /_/) {
@@ -4068,6 +4140,9 @@
}
if (keys(%respids) > 0) {
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Show Parameters for Response(s)?')).
+ '<fieldset class="LC_borderless">'.
+ '<legend class="LC_visually_hidden">'.
+ &mt('Include response-specific row(s)?').'</legend>'.
'<label>'.
'<input type="radio" name="psresp" value="all"'.$allrespson.' />'.
&mt('Yes').
@@ -4076,6 +4151,7 @@
'<input type="radio" name="psresp" value="0"'.$allrespsoff.' />'.
&mt('No').
'</label>'.
+ '</fieldset>'.
&Apache::lonhtmlcommon::row_closure());
}
&usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
@@ -4419,29 +4495,29 @@
my $tmp="";
if ($uname) {
my $person=&Apache::loncommon::plainname($uname,$udom);
- $tmp.=&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
+ $tmp.=&mt("User")." <span class=\"LC_parm_scope_all\"><i>$uname \($person\) </i></span> ".
&mt('in')." \n";
} else {
- $tmp.="<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n";
+ $tmp.="<span class=\"LC_parm_scope_all\"><i>".&mt('all').'</i></span> '.&mt('users in')." \n";
}
if ($cgroup) {
- $tmp.=&mt("Group")." <font color=\"red\"><i>$cgroup".
- "</i></font> ".&mt('of')." \n";
+ $tmp.=&mt("Group")." <span class=\"LC_parm_scope_all\"><i>$cgroup".
+ "</i></span> ".&mt('of')." \n";
$csec = '';
} elsif ($csec) {
- $tmp.=&mt("Section")." <font color=\"red\"><i>$csec".
- "</i></font> ".&mt('of')." \n";
+ $tmp.=&mt("Section")." <span class=\"LC_parm_scope_all\"><i>$csec".
+ "</i></span> ".&mt('of')." \n";
}
- $r->print('<div align="center"><h4>'
+ $r->print('<div align="center"><h2 class="LC_heading_3">'
.&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
- ,$foldermap.'<br /><font color="red"><i>'.$showtitle.'</i></font><br />'
+ ,$foldermap.'<br /><span class="LC_parm_scope_all"><i>'.$showtitle.'</i></span><br />'
,$tmp
- ,'<font color="red"><i>'.$coursename.'</i></font>'
+ ,'<span class="LC_parm_scope_all"><i>'.$coursename.'</i></span>'
)
- ."<br /></h4>\n"
+ ."<br /></h2>\n"
);
#---------------------------------------------------------------- print table
- $r->print('<p>'.&Apache::loncommon::start_data_table()
+ $r->print(&Apache::loncommon::start_data_table()
.&Apache::loncommon::start_data_table_header_row()
.'<th>'.&mt('Parameter Name').'</th>'
.'<th>'.&mt('Value').'</th>'
@@ -4467,8 +4543,8 @@
$readonly,\@recurseup,\%maptitles,\%allmaps_inverted,
\$numreclinks);
}
- $r->print(&Apache::loncommon::end_data_table().'</p>'
- .'</div>'
+ $r->print(&Apache::loncommon::end_data_table()
+ .'</div><br />'
);
} # end each map
} # end of $parmlev eq map
@@ -4605,19 +4681,19 @@
# @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added)
# @returns {string}
sub tablestart {
- my ($readonly,$is_map) = @_;
+ my ($readonly,$is_map,$colidnum) = @_;
if ($tableopen) {
return '';
} else {
$tableopen=1;
- my $output = &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th>';
+ my $output = &Apache::loncommon::start_data_table('LC_paramDefault').'<tr><th>'.&mt('Parameter').'</th>';
if ($readonly) {
$output .= '<th>'.&mt('Current value').'</th>';
} else {
- $output .= '<th>'.&mt('Delete').'</th>'.
- '<th>'.&mt('Set to ...').'</th>';
+ $output .= '<th id="del'.$colidnum.'">'.&mt('Delete').'</th>'.
+ '<th id="set'.$colidnum.'">'.&mt('Set to ...').'</th>';
if ($is_map) {
- $output .= '<th>'.&mt('Recursive?').'</th>';
+ $output .= '<th id="rec'.$colidnum.'">'.&mt('Recursive?').'</th>';
}
}
$output .= '</tr>';
@@ -5122,6 +5198,8 @@
my $pointer=0;
$tableopen=0;
my $foundkeys=0;
+ my $colcounter=0;
+ my %cols;
my %keyorder=&standardkeyorder();
my $readonlyall = $readonly;
@@ -5228,6 +5306,17 @@
($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
my $section=&mt('All Students');
$readonly = $readonlyall;
+ my $colidnum;
+ my $colsuffix = $thiskey;
+ $colsuffix =~ s/.\Q$name\E$//;
+ $colsuffix =~ s/\Q___(rec)\E.\Q$part\E$/___(all).$part/;
+ if (exists($cols{$colsuffix})) {
+ $colidnum = $cols{$colsuffix};
+ } else {
+ $colidnum = $colcounter;
+ $cols{$colsuffix} = $colidnum;
+ $colcounter ++;
+ }
my $userscope;
my $showval = $$resourcedata{$thiskey};
if ($middle=~/^\[(.*)\]/) {
@@ -5312,23 +5401,23 @@
}
if ($sortorder eq 'realmstudent') {
if ($realm ne $oldrealm) {
- $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
+ $r->print(&tableend()."\n<hr /><h2>$realm</h2>");
$oldrealm=$realm;
$oldsection='';
}
if ($section ne $oldsection) {
- $r->print(&tableend()."\n<h2>$section</h2>");
+ $r->print(&tableend()."\n<h3>$section</h3>");
$oldsection=$section;
$oldpart='';
}
} else {
if ($section ne $oldsection) {
- $r->print(&tableend()."\n<hr /><h1>$section</h1>");
+ $r->print(&tableend()."\n<hr /><h2>$section</h2>");
$oldsection=$section;
$oldrealm='';
}
if ($realm ne $oldrealm) {
- $r->print(&tableend()."\n<h2>$realm</h2>");
+ $r->print(&tableend()."\n<h3>$realm</h3>");
$oldrealm=$realm;
$oldpart='';
}
@@ -5351,11 +5440,13 @@
}
$advice = '<br /><span class="LC_fontsize_small LC_cusr_emph">'.$advice.'</span>';
}
- $r->print(&tablestart($readonly,$is_map).
- &Apache::loncommon::start_data_table_row().
- '<td><b>'.&mt($parmitem).
- '</b>'.$advice.'</td>');
- unless ($readonly) {
+ $r->print(&tablestart($readonly,$is_map,$colidnum).
+ &Apache::loncommon::start_data_table_row());
+ if ($readonly) {
+ $r->print('<td><b>'.&mt($parmitem).'</b>'.$advice.'</td>');
+ } else {
+ $r->print('<th scope="row" class="LC_rowheader" id="row'.$foundkeys.'"><b>'.
+ &mt($parmitem).'</b>'.$advice.'</th>');
my $disabled;
if (($name eq 'availablestudent') &&
(($showval eq '') || ($userscope))) {
@@ -5364,10 +5455,9 @@
$disabled = ' disabled="disabled"';
}
$r->print('<td><input type="checkbox" name="del_'.
- $thiskey.'"'.$disabled.' /></td>');
+ $thiskey.'"'.$disabled.' aria-labelledby="row'.$foundkeys.' del'.$colidnum.'" /></td>');
}
$r->print('<td>');
- $foundkeys++;
if (&isdateparm($thistype)) {
my $jskey='key_'.$pointer;
my $state;
@@ -5383,7 +5473,7 @@
unless ($readonly) {
$r->print(
'<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
- (($showval!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$showval.'">'.
+ (($showval!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?action=dateshift1&timebase='.$showval.'">'.
&mt('Shift all dates based on this date').'</a></span>':'').
&date_sanity_info($showval)
);
@@ -5398,9 +5488,9 @@
$readonly = 1;
}
$r->print(&string_selector($thistype,$thiskey,
- $showval,$name,$readonly));
+ $showval,$name,$readonly,$colidnum,$foundkeys));
} else {
- $r->print(&default_selector($thiskey,$showval,$readonly));
+ $r->print(&default_selector($thiskey,$showval,$readonly,$colidnum,$foundkeys));
}
unless ($readonly) {
$r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
@@ -5409,7 +5499,7 @@
$r->print('</td>');
if ($is_map) {
if (($name eq 'encrypturl') || ($name eq 'hiddenresource')) {
- $r->print('<td><table><tr><td>'.&mt('Yes').'</td></tr></table></td>');
+ $r->print('<td>'.&mt('Yes').'</td>');
} else {
my ($disabled,$recon,$recoff);
if ($readonly) {
@@ -5420,11 +5510,14 @@
} else {
$recoff = ' checked="checked"';
}
- $r->print('<td><table><tr><td><label><input type="radio" name="rec_'.$thiskey.'" value="1"'.$recon.$disabled.' />'.&mt('Yes').'</label>'.
- '</td><td><label><input type="radio" name="rec_'.$thiskey.'" value="0"'.$recoff.$disabled.' />'.&mt('No').'</label></td></tr></table></td>');
+ $r->print('<td><fieldset class="LC_borderless">'.
+ '<legend class="LC_visually_hidden">'.&mt('Recursive?').'</legend>'.
+ '<span class="LC_nobreak"><label><input type="radio" name="rec_'.$thiskey.'" value="1"'.$recon.$disabled.' />'.&mt('Yes').'</label>'.
+ ' <label><input type="radio" name="rec_'.$thiskey.'" value="0"'.$recoff.$disabled.' />'.&mt('No').'</label></span></fieldset></td>');
}
}
$r->print(&Apache::loncommon::end_data_table_row());
+ $foundkeys ++;
}
}
return $foundkeys;
@@ -5477,14 +5570,16 @@
# @param {string} $thiskey - parameter key
# @param {string} $showval - the current value
# @param {boolean} $readonly - true if the field should not be made editable
+# @param {integer} $colidnum - column number for current column
+# @param {integer} $foundkeys - row number for current row
# @returns {string}
sub default_selector {
- my ($thiskey, $showval, $readonly) = @_;
+ my ($thiskey, $showval, $readonly, $colidnum, $foundkeys) = @_;
my $disabled;
if ($readonly) {
$disabled = ' disabled="disabled"';
}
- return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' />';
+ return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'"'.$disabled.' aria-labelledby="set'.$colidnum.' row'.$foundkeys.'" />';
}
# Returns HTML to enter allow/deny rules related to IP addresses.
@@ -5492,9 +5587,11 @@
# @param {string} $thiskey - parameter key
# @param {string} $showval - the current value
# @param {boolean} $readonly - true if the fields should not be made editable
+# @param {integer} $colidnum - column number for current column
+# @param {integer} $foundkeys - row number for current row
# @returns {string}
sub string_ip_selector {
- my ($thiskey, $showval, $readonly) = @_;
+ my ($thiskey, $showval, $readonly, $colidnum, $foundkeys) = @_;
my %access = (
allow => [],
deny => [],
@@ -5527,7 +5624,7 @@
$addmore = "\n".'<button class="LC_add_ipacc_button">'.&mt('Add more').'</button>';
}
my $output = '<input type="hidden" name="set_'.$thiskey.'" />
-<table><tr><th>'.&mt('Allow from').'</th><th>'.&mt('Deny from').'</th></tr><tr>';
+<table><tr><th id="allow'.$colidnum.'">'.&mt('Allow from').'</th><th id="deny'.$colidnum.'">'.&mt('Deny from').'</th></tr><tr>';
foreach my $acctype ('allow','deny') {
$output .= '
<td valign="top">
@@ -5535,7 +5632,7 @@
<div class="LC_string_ipacc_inner">'."\n";
my $num = 0;
foreach my $curr (@{$access{$acctype}}) {
- $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' />';
+ $output .= '<div><input type="text" name="setip'.$acctype.'_'.$thiskey.'" value="'.$curr.'"'.$disabled.' aria-labelledby="row'.$foundkeys.' '.$acctype.$colidnum.'" />';
if ($num > 0) {
$output .= '<a href="#" class="LC_remove_ipacc">'.&mt('Remove').'</a>';
}
@@ -5806,7 +5903,7 @@
}
sub string_grace_selector {
- my ($thiskey, $showval, $readonly) = @_;
+ my ($thiskey, $showval, $readonly, $foundkeys) = @_;
my $addmore;
unless ($readonly) {
$addmore = "\n".'<button class="LC_add_grace_button">'.&mt('Add more').'</button>';
@@ -5821,7 +5918,7 @@
} else {
@current = ($showval);
}
- my $num = scalar(@current);
+ my $num = 0;
foreach my $item (@current) {
my ($delta,$fraction,$gradational) = split(/:/,$item);
if (($delta =~ /^\d+$/) && ($fraction =~ /^(0|1)\.?\d*$/) &&
@@ -5831,18 +5928,19 @@
$gradchk = ' checked="checked"';
}
$output .= &grace_form($thiskey,$delta,$fraction,$gradchk,
- $readonly);
+ $readonly,$foundkeys,$num);
+ $num ++;
}
}
} elsif (!$readonly) {
- $output .= &grace_form($thiskey,'','','',$readonly);
+ $output .= &grace_form($thiskey,'','','',$readonly,$foundkeys,0);
}
$output .= '</div>'.$addmore.'</div>';
return $output;
}
sub grace_form {
- my ($thiskey,$delta,$fraction,$gradchkon,$readonly) = @_;
+ my ($thiskey,$delta,$fraction,$gradchkon,$readonly,$foundkeys,$counter) = @_;
my $disabled;
if ($readonly) {
$disabled = ' disabled="disabled"';
@@ -5866,13 +5964,13 @@
$amount = int($delta/$factor);
$delta %= $factor;
}
- $output .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
+ $output .= '<label>'.&Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
\%select,'',$readonly);
- $output .= ' '.$lt{$name}.' ';
+ $output .= ' '.$lt{$name}.'</label> ';
}
$output .= '</fieldset>'.
- '<fieldset class="LC_grace"><legend>'.$lt{'pcr'}.'</legend>'.
- '<input type="text" size="3" name="frac_'.$thiskey.'" value="'.$fraction.'"'.$disabled.' />'.
+ '<fieldset class="LC_grace"><legend><label for="frac_'.$foundkeys.'.'.$counter.'">'.$lt{'pcr'}.'</label></legend>'.
+ '<input type="text" size="3" name="frac_'.$thiskey.'" id="frac_'.$foundkeys.'.'.$counter.'" value="'.$fraction.'"'.$disabled.' />'.
' <label><input type="checkbox" value="1" name="grad_'.$thiskey.'"'.$gradchkon.$disabled.' />'.
$lt{'grad'}.'</label></fieldset>';
unless ($readonly) {
@@ -6008,10 +6106,10 @@
# @param {boolean} $readonly - true if the values should not be made editable
# @returns {string}
sub string_selector {
- my ($thistype, $thiskey, $showval, $name, $readonly) = @_;
+ my ($thistype, $thiskey, $showval, $name, $readonly, $colidnum, $foundkeys) = @_;
if (!exists($strings{$thistype})) {
- return &default_selector($thiskey,$showval,$readonly);
+ return &default_selector($thiskey,$showval,$readonly,$colidnum,$foundkeys);
}
my %skiptype;
@@ -6059,9 +6157,9 @@
}
if ($thistype eq 'string_ip') {
- return &string_ip_selector($thiskey,$showval,$readonly);
+ return &string_ip_selector($thiskey,$showval,$readonly,$colidnum,$foundkeys);
} elsif ($thistype eq 'string_grace') {
- return &string_grace_selector($thiskey,$showval,$readonly);
+ return &string_grace_selector($thiskey,$showval,$readonly,$foundkeys);
} elsif ($thistype eq 'string_deeplink') {
return &string_deeplink_selector($thiskey,$showval,$readonly);
}
@@ -6089,20 +6187,9 @@
$rem = $i%($numinrow);
if ($rem == 0) {
if ($i > 0) {
- $result .= '</tr>';
- }
- $result .= '<tr>';
- }
- my $colspan;
- if ($i == @{ $strings{$thistype} }-1) {
- $rem = @{ $strings{$thistype} }%($numinrow);
- if ($rem) {
- my $colsleft = $numinrow - $rem;
- if ($colsleft) {
- $colspan = $colsleft+1;
- $colspan = ' colspan="'.$colspan.'"';
- }
+ $result .= '</div>';
}
+ $result .= '<div role="row" class="LC_grid_row">';
}
my ($add,$onchange,$css_class);
if ($thistype eq 'string_lenient') {
@@ -6133,9 +6220,9 @@
$add = ' <div id="LC_parmtext_'.$thiskey.'" style="display:'.$display.'"><table>'.
'<tr><th colspan="2">'.&mt("Foil's submission status").'</th><th>'.&mt('Points').'</th></tr>';
foreach my $reltype ('corrchkd','corrunchkd','incorrchkd','incorrunchkd') {
- $add .= '<tr><td> </td><td>'.$relatives{$reltype}.'</td>'."\n".
+ $add .= '<tr><td> </td><td><label for="settext_'.$reltype.'_'.$thiskey.'">'.$relatives{$reltype}.'</label></td>'."\n".
'<td><input type="text" name="settext_'.$thiskey.'"'.
- ' value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'.
+ ' id="settext_'.$reltype.'_'.$thiskey.'" value="'.$textval{$reltype}.'" size="3"'.$disabled.' />'.
'</td></tr>';
}
$add .= '</table></div>'."\n";
@@ -6143,20 +6230,23 @@
$onchange = ' onclick="javascript:toggleParmTextbox(this.form,'."'$thiskey'".');"';
$css_class = ' class="LC_lenient_radio"';
}
- $result .= '<td class="LC_left_item"'.$colspan.'>'.
+ $result .= '<div role="gridcell" class="LC_grid_cell">'.
'<span class="LC_nobreak"><label>'.
'<input type="radio" name="set_'.$thiskey.
'" value="'.$name.'"'.$onchange.$css_class.$disabled;
if ($showval eq $name) {
$result .= ' checked="checked"';
}
- $result .= ' />'.&mt($description).'</label>'.$add.'</span></td>';
+ $result .= ' />'.&mt($description).'</label>'.$add.'</span></div>';
$i++;
}
- $result .= '</tr>';
+ $result .= '</div>';
}
if ($result) {
- $result = '<table border="0">'.$result.'</table>';
+ $result = '<fieldset class="LC_borderless">'.
+ '<legend class="LC_visually_hidden">'.$name.'</legend>'.
+ '<div role="grid" class="LC_grid" style="margin: 0;">'.$result.'</div>'.
+ '</fieldset>';
}
return $result;
}
@@ -6278,9 +6368,9 @@
$select{''} = '';
$amount = '';
}
- $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
+ $result .= '<label>'.&Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
\%select,'',$readonly);
- $result .= ' '.&mt($name);
+ $result .= ' '.&mt($name).'</label>';
}
if ($name eq 'interval') {
unless ($skipval{'done'}) {
@@ -6314,7 +6404,8 @@
if ($readonly) {
$disabled = ' disabled="disabled"';
}
- $result .= '<br /><span class="LC_nobreak">'.&mt('Include "done" button').
+ $result .= '<br /><span class="LC_nobreak">'.
+ '<fieldset class="LC_grace" style="line-height: 170%;"><legend>'.&mt('Include "done" button').'</legend>'.
'<label><input type="radio" value="" name="done_'.$thiskey.'"'.$checkedoff.$onclick.$disabled.' />'.
&mt('No').'</label>'.(' 'x2).
'<label><input type="radio" value="_done" name="done_'.$thiskey.'"'.$checkedon.$onclick.$disabled.' />'.
@@ -6323,9 +6414,9 @@
&mt('Yes, with proctor key').'</label>'.
'<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.
- '<span class="LC_nobreak">'.&mt('Button text').': '.
+ '<span class="LC_nobreak"><label>'.&mt('Button text').': '.
'<input type="text" name="done_'.$thiskey.'_buttontext" id="done_'.$thiskey.'_buttontext" value="'.
- &HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';
+ &HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></label></span></fieldset>';
}
}
unless ($readonly) {
@@ -6575,52 +6666,56 @@
}
# Menu to select levels, etc
- $r->print('<div class="LC_Box">');
- #$r->print('<h2 class="LC_hcell">Step 1</h2>');
- $r->print('<div>');
+ $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Resource Specification'),'','h2','LC_heading_3'));
$r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
&levelmenu($r,\%alllevs,$parmlev);
$r->print(&Apache::lonhtmlcommon::row_closure());
&mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
$r->print(&Apache::lonhtmlcommon::row_closure(1));
$r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('</div></div>');
- $r->print('<div class="LC_Box">');
- $r->print('<div>');
+ $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Parameter Specification'),'','h2','LC_heading_3'));
&displaymenu($r,\%allparms,\@pscat,\%keyorder);
+
+ $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Granularity'),'','h2','LC_heading_3'));
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
my $sectionselector = §ionmenu(\@selected_sections);
my $groupselector = &groupmenu(\@selected_groups);
- $r->print('<table>'.
- '<tr><th>'.&mt('Parts').'</th>');
+ $r->print('<div role="grid" class="LC_grid" style="margin: 0;">'
+ .'<div role="row" class="LC_grid_row">'
+ .'<div role="gridcell" class="LC_grid_cell">'
+ .'<b><label for="psprt">'.&mt('Parts').'</label></b></div>');
if ($sectionselector) {
- $r->print('<th>'.&mt('Section(s)').'</th>');
+ $r->print('<div role="gridcell" class="LC_grid_cell">'
+ .'<b><label for="Section">'.&mt('Section(s)').'</label></b></div>');
}
if ($groupselector) {
- $r->print('<th>'.&mt('Group(s)').'</th>');
+ $r->print('<div role="gridcell" class="LC_grid_cell">'
+ .'<b><label for="Group">'.&mt('Group(s)').'</label></b></div>');
}
- $r->print('</tr><tr><td>');
+ $r->print('</div><div role="row" class="LC_grid_row">'
+ .'<div role="gridcell" class="LC_grid_cell">');
&partmenu($r,\%allparts,\@psprt);
- $r->print('</td>');
- if ($sectionselector) {
- $r->print('<td>'.$sectionselector.'</td>');
+ $r->print('</div>');
+ if ($sectionselector) {
+ $r->print('<div role="gridcell" class="LC_grid_cell">'
+ .$sectionselector
+ .'</div>');
}
if ($groupselector) {
- $r->print('<td>'.$groupselector.'</td>');
+ $r->print('<div role="gridcell" class="LC_grid_cell">'
+ .$groupselector
+ .'</div>');
}
- $r->print('</tr></table>');
+ $r->print('</div></div>');
$r->print(&Apache::lonhtmlcommon::row_closure(1));
$r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('</div></div>');
+ $r->print('</div>');
- $r->print('<div class="LC_Box">');
- $r->print('<div>');
my $sortorder=$env{'form.sortorder'};
unless ($sortorder) { $sortorder='realmstudent'; }
&sortmenu($r,$sortorder,'newoverview');
- $r->print('</div></div>');
$r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" id="newoverviewdis" /></p>');
@@ -6835,7 +6930,7 @@
# List data
my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder,'overview',$classlist,$readonly);
- $r->print(&tableend().'<p>');
+ $r->print(&tableend());
if ($foundkeys) {
unless ($readonly) {
$r->print('<p>'.$submitbutton.'</p>');
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1518 loncom/interface/loncommon.pm:1.1519
--- loncom/interface/loncommon.pm:1.1518 Mon Apr 27 19:13:12 2026
+++ loncom/interface/loncommon.pm Tue Apr 28 02:36:03 2026
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1518 2026/04/27 19:13:12 raeburn Exp $
+# $Id: loncommon.pm,v 1.1519 2026/04/28 02:36:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -8327,26 +8327,30 @@
}
span.LC_parm_scope_all {
- color: red;
+ color: $error;
}
span.LC_parm_scope_folder {
- color: green;
+ color: $info;
}
span.LC_parm_scope_resource {
- color: orange;
+ color: $warning;
}
span.LC_parm_part {
color: blue;
}
+div.LC_session_parm_alert {
+ color: #FFFC52;
+}
+
span.LC_parm_folder,
span.LC_parm_symb {
- font-size: x-small;
+ font-size: small;
font-family: $mono;
- color: #AAAAAA;
+ color: #636363;
}
ul.LC_parm_parmlist li {
@@ -8573,7 +8577,7 @@
}
.LC_topic_bar span {
- left: 0.5em;
+ left: 1.0em;
position: absolute;
vertical-align: middle;
font-size: 1.2em;
Index: loncom/interface/lonhtmlcommon.pm
diff -u loncom/interface/lonhtmlcommon.pm:1.429 loncom/interface/lonhtmlcommon.pm:1.430
--- loncom/interface/lonhtmlcommon.pm:1.429 Tue Jan 20 18:45:04 2026
+++ loncom/interface/lonhtmlcommon.pm Tue Apr 28 02:36:03 2026
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common html routines
#
-# $Id: lonhtmlcommon.pm,v 1.429 2026/01/20 18:45:04 raeburn Exp $
+# $Id: lonhtmlcommon.pm,v 1.430 2026/04/28 02:36:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -2905,10 +2905,12 @@
# If input for number is empty only the title will be displayed.
# 2. title text to display.
# 3. optional id for the <div>
+# 4. optional heading tag: h1, h2, h3, h4, h5 or h6.
+# 5. optional CSS class for heading tag.
# Outputs - a scalar containing html mark-up for the div.
sub topic_bar {
- my ($num,$title,$id) = @_;
+ my ($num,$title,$id,$hlevel,$hclass) = @_;
my $number = '';
if ($num ne '') {
$number = '<span>'.$num.'</span>';
@@ -2916,7 +2918,16 @@
if ($id ne '') {
$id = 'id="'.$id.'"';
}
- return '<div class="LC_topic_bar" '.$id.'>'.$number.$title.'</div>';
+ my ($hopen,$hclose);
+ if ($hlevel =~ /^h[1-6]$/) {
+ if ($hclass ne '') {
+ $hopen = '<'.$hlevel.' class="'.$hclass.'">';
+ } else {
+ '<'.$hlevel.'>';
+ }
+ $hclose = '</'.$hlevel.'>';
+ }
+ return '<div class="LC_topic_bar" '.$id.'>'.$hopen.$number.$title.$hclose.'</div>';
}
##############################################
More information about the LON-CAPA-cvs
mailing list