--- loncom/interface/slotrequest.pm 2023/07/07 03:52:40 1.145 +++ loncom/interface/slotrequest.pm 2025/03/20 17:59:20 1.150 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for requesting to have slots added to a students record # -# $Id: slotrequest.pm,v 1.145 2023/07/07 03:52:40 raeburn Exp $ +# $Id: slotrequest.pm,v 1.150 2025/03/20 17:59:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -50,7 +50,7 @@ sub fail { } else { $r->print('<p>'.&mt('Failed.').'</p>'); } - + &return_link($r); &end_page($r); } @@ -60,8 +60,8 @@ sub start_page { my $args; if (ref($brcrum) eq 'ARRAY') { $args = {bread_crumbs => $brcrum}; - if ($bread_crumbs_component) { - $args->{bread_crumbs_component} = $bread_crumbs_component; + if ($bread_crumbs_component) { + $args->{bread_crumbs_component} = $bread_crumbs_component; } } if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { @@ -104,7 +104,7 @@ sub start_page { sub end_page { my ($r)=@_; - $r->print(&Apache::loncommon::end_page()); + $r->print('</div>'.&Apache::loncommon::end_page()); } sub reservation_js { @@ -284,7 +284,7 @@ function uncheckSlotRadio() { } if (slotpicks.length) { for (var i=0; i<slotpicks.length; i++) { - slotpicks[i].checked = false; + slotpicks[i].checked = false; } } } @@ -333,7 +333,7 @@ function toggleSlotMap(maprownum,rownum) for (var i=0; i<resrows.length; i++) { resrows[i].style.display = rowdisplay; if (rowdisplay == 'table-row') { - mapbgidx ++; + mapbgidx ++; var bgcolnew = mapbgidx % 2; var bgcolold = (mapbgidx+1) % 2; var k = i+parseInt(rownum)+1; @@ -368,7 +368,7 @@ function toggleSlotMap(maprownum,rownum) if (table.rows[i].style.display != 'none') { idx ++; var bgcolnew = idx % 2; - var bgcolold = (idx+1) % 2; + var bgcolold = (idx+1) % 2; j = i+1; if (document.getElementById('LC_slotmaprow_'+j)) { document.getElementById('LC_slotmaprow_'+j).className = rowclasses[bgcolnew]; @@ -412,7 +412,7 @@ sub get_course { sub get_reservation_ids { my ($slot_name)=@_; - + my ($cnum,$cdom)=&get_course(); my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, @@ -457,7 +457,7 @@ sub check_for_reservation { || &Apache::lonnet::error($course) || &Apache::lonnet::error(%slots)) { return 'error: Unable to determine current status'; - } + } my @got; my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); foreach my $slot_name (@sorted_slots) { @@ -592,7 +592,7 @@ sub make_reservation { foreach my $other_slot (split(/:/, $value)) { if ($other_slot eq $slot_name) { my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom, - $cnum, "^$slot_name\0"); + $cnum, "^$slot_name\0"); if (&Apache::lonnet::error($value)) { return 'error: Unable to determine current status'; } @@ -618,14 +618,14 @@ sub make_reservation { my $num=(split('\0',$id))[1]; if ($num > $last) { $last=$num; } } - + my $wanted=$last+1; &Apache::lonxml::debug("wanted $wanted<br />"); if (scalar(@ids) >= $max) { # full up return undef; } - + my %reservation=('name' => $env{'user.name'}.':'.$env{'user.domain'}, 'timestamp' => time, 'symb' => $symb_for_db); @@ -704,7 +704,7 @@ sub remove_registration { sub remove_registration_user { my ($r) = @_; - + my $slot_name = $env{'form.slotname'}; my $name = &Apache::loncommon::plainname($env{'form.uname'}, @@ -714,7 +714,7 @@ sub remove_registration_user { my $msg = &mt('Remove [_1] from slot [_2] for [_3]', $name,$slot_name,$title); - + &remove_registration_confirmation($r,$msg,['uname','udom','slotname', 'entry','symb','context']); } @@ -750,14 +750,14 @@ END_CONFIRM sub release_all_slot { my ($r,$mgr)=@_; - + my $slot_name = $env{'form.slotname'}; my ($cnum,$cdom)=&get_course(); my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, "^$slot_name\0"); - + $r->print('<p>'.&mt('Releasing reservations').'</p>'); foreach my $entry (sort { $consumed{$a}{'name'} cmp @@ -801,7 +801,7 @@ sub release_slot { } else { $r->print("<p>$msg</p>"); } - + if ($mgr eq 'F') { $r->print('<p><a href="/adm/slotrequest?command=showslots">'. &mt('Return to slot list').'</a></p>'); @@ -1166,7 +1166,7 @@ sub return_link { my $target = &return_target(); if (($env{'form.command'} eq 'manageresv') || ($env{'form.context'} eq 'usermanage')) { $r->print('<p><a href="/adm/slotrequest?command=manageresv" target="'.$target.'">'. - &mt('Return to reservations').'</a></p>'); + &mt('Return to reservations').'</a></p>'); } else { $r->print('<p><a href="/adm/flip?postdata=return:" target="'.$target.'">'. &mt('Return to last resource').'</a></p>'); @@ -1340,7 +1340,7 @@ sub allowed_slot { if (($slot->{'endreserve'}) && ($slot->{'endreserve'} < time)) { return 0; - } + } &Apache::lonxml::debug("$slot_name reserve good"); my $userallowed=0; @@ -1473,7 +1473,7 @@ sub show_choices { } } my $showfilter = 'none'; - $output .= '<fieldset><legend>'.&mt('Actions').'</legend>'."\n". + $output .= '<fieldset><legend>'.&mt('Actions').':</legend>'."\n". '<form method="post" name="reservationdisplay_'.$num. '" action="" onsubmit="toggleSlotDisplay(this.form,'."'$num'".');">'; my @options = ('all','filter'); @@ -1487,7 +1487,7 @@ sub show_choices { ); foreach my $option (@options) { my $onclick = "toggleSlotDisplay(this.form,'$num');"; - if (($option eq 'show') && ($env{'form.command'} eq 'manageresv')) { + if (($option eq 'show') && ($env{'form.command'} eq 'manageresv')) { $onclick .= "currSlotDisplay$num(this.form,'$num');"; } $output .= '<span class="LC_nobreak"><label>'. @@ -1507,7 +1507,7 @@ sub show_choices { // <![CDATA[ function currSlotDisplay$num() { var currslot = new Array($numreserved); -$js +$js for (var j=0; j<$numreserved; j++) { if (document.getElementById('LC_slotrow_$num\_'+currslot[j])) { document.getElementById('LC_slotrow_$num\_'+currslot[j]).style.display = ''; @@ -1670,7 +1670,7 @@ sub to_show { } return 0; } - + return 1; } @@ -1730,7 +1730,7 @@ sub show_table { ); return; } - + my %Saveable_Parameters = ('show' => 'array', 'when' => 'scalar', 'order' => 'scalar', @@ -1820,7 +1820,7 @@ sub show_table { my $name_filter = {'type' => $name_filter_type, 'value' => $env{'form.name_filter_value'},}; - + #deleted slot filtering #default to hide if no value $env{'form.deleted'} ||= 'hide'; @@ -1833,40 +1833,36 @@ sub show_table { <input type="hidden" name="command" value="showslots" />'); $r->print('<div>'); $r->print('<table class="inline"> - <tr><th>'.&mt('Show').'</th> - <th>'.&mt('Student Display').'</th> - <th>'.&mt('Open').'</th> - <th>'.&mt('Slot Name Filter').'</th> + <tr><th><label for="show">'.&mt('Show').'</label></th> + <th><label for="studisplay">'.&mt('Student Display').'</label></th> + <th><label for="when">'.&mt('Open').'</label></th> + <th><label for="name_filter_type">'.&mt('Slot Name Filter').'</label></th> <th>'.&mt('Options').'</th> </tr> - <tr><td valign="top">'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order). + <tr><td valign="top">'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order,'show'). '</td> <td valign="top"> '.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display, 6,\%stu_display_fields, - \@stu_display_order).' + \@stu_display_order,'studisplay').' </td> - <td valign="top">'.&Apache::loncommon::select_form($when,'when',\%when_fields). + <td valign="top">'.&Apache::loncommon::select_form($when,'when',\%when_fields,'','','when'). '</td> - <td valign="top">'.&Apache::loncommon::select_form($name_filter_type, + <td valign="top"><span class="LC_nobreak">'.&Apache::loncommon::select_form($name_filter_type, 'name_filter_type', - \%name_filter_type_fields). - '<br />'. + \%name_filter_type_fields,'','','name_filter_type'). + ' '. &Apache::lonhtmlcommon::textbox('name_filter_value', $env{'form.name_filter_value'}, - 15). - '</td> + 15,'aria-label="'.&mt('Name filter').'"'). + '</span></td> <td valign="top"> - <table> - <tr> - <td rowspan="2">'.&mt('Deleted slots:').'</td> - <td><label>'.$show_radio.&mt('Show').'</label></td> - </tr> - <tr> - <td><label>'.$hide_radio.&mt('Hide').'</label></td> - </tr> - </table> - </td> + <fieldset class="LC_delete_slot"> + <legend>'.&mt('Deleted slots').'</legend> + <span class="LC_nobreak"><label>'.$show_radio.&mt('Show').'</label> + <label>'.$hide_radio.&mt('Hide').'</label></span> + </fieldset> + </td> </tr> </table>'); $r->print('</div>'); @@ -1874,7 +1870,7 @@ sub show_table { my $linkstart='<a href="/adm/slotrequest?command=showslots&order='; my $tableheader = &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row().' - <th></th>'; + <th><span class="LC_visually_hidden">'.&mt('Action').'</span></th>'; foreach my $which (@show_order) { if ($which ne 'proctor' && exists($show{$which})) { $tableheader .= '<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>'; @@ -1900,7 +1896,7 @@ sub show_table { return lc($a) cmp lc($b); } } elsif ($env{'form.order'} eq 'uniqueperiod') { - + if ($slots{$a}->{'uniqueperiod'}[0] ne $slots{$b}->{'uniqueperiod'}[0]) { return ($slots{$a}->{'uniqueperiod'}[0] @@ -1934,7 +1930,7 @@ sub show_table { } my $description=&get_description($slot,$slots{$slot}); my ($id_count,$ids); - + if (exists($show{'scheduled'}) || exists($show{'space'}) ) { my $re_str = "$slot\0"; my @this_slot = grep(/^\Q$re_str\E/,keys(%consumed)); @@ -2041,11 +2037,11 @@ sub show_table { my ($edit,$delete,$showlog,$remove_all); if ($mgr) { $edit=(<<"EDITLINK"); -<a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a> +<p class="LC_medium_line"><a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a></p> EDITLINK $delete=(<<"DELETELINK"); -<a href="/adm/slotrequest?command=delete&slotname=$slot">$lt{'delete'}</a> +<p class="LC_medium_line"><a href="/adm/slotrequest?command=delete&slotname=$slot">$lt{'delete'}</a></p> DELETELINK $remove_all=&remove_link($slot,'remove all').'<br />'; @@ -2058,7 +2054,7 @@ DELETELINK } $showlog=(<<"LOGLINK"); -<a href="/adm/slotrequest?command=slotlog&slotname=$slot">$lt{'slotlog'}</a> +<p class="LC_medium_line"><a href="/adm/slotrequest?command=slotlog&slotname=$slot">$lt{'slotlog'}</a></p> LOGLINK if ($slots{$slot}{'type'} ne 'schedulable_student') { @@ -2298,7 +2294,10 @@ sub manage_reservations { my $slotheader = '<p>'. &mt('Your reservation status for any such assignments is listed below:'). '</p>'. - '<table class="LC_data_table LC_tableOfContent" id="LC_slot_reservations">'."\n"; + '<table class="LC_data_table LC_tableOfContent" id="LC_slot_reservations">'."\n". + '<tr class="LC_visually_hidden">'. + '<th>'.&mt('Resource or Folder').'</th>'. + '<th colspan="2">'.&mt('Reservation Status').'</th></tr>'."\n"; my $shownheader = 0; my $currmap; my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef); @@ -2332,8 +2331,8 @@ sub manage_reservations { $arrowstate = 'closed'; } $row .= '<td>'.$spacers.'<img src="/adm/lonIcons/arrow.'.$arrowstate.'.gif" '. - 'id="arrow'.$mapnum.'" '.'alt="arrow" onmouseover="this.style.cursor=\'pointer\'" '. - 'onclick="'."toggleSlotMap('$mapnum','$rownum');".'" />'. + 'id="arrow'.$mapnum.'" '.'alt="arrow" onmouseover="this.style.cursor=\'pointer\'" tabindex="0" '. + 'onclick="'."toggleSlotMap('$mapnum','$rownum');".'" onkeydown="'."toggleSlotMap('$mapnum','$rownum');".'" />'. $icon.(' ' x6).'</td>'."\n"; if (ref($output{$currmap}) eq 'HASH') { my $formnum = $mapnum.'_'.$reservable+1; @@ -2374,7 +2373,7 @@ sub manage_reservations { $container{$currcontainer} = $resource; $container_title{$currcontainer} = $resource->compTitle(); } - if (($resource->is_problem() || $resource->is_tool)) { + if ($resource->is_problem() || $resource->is_tool()) { next unless (exists($output{$symb})); $reservable ++; $rownum ++; @@ -2488,7 +2487,7 @@ sub slot_chooser { } } } - next if ($exclude); + next if ($exclude); } } } @@ -2914,11 +2913,19 @@ sub display_filter { my ($formname,$cdom,$cnum,$curr,$version,$allsymbs) = @_; my $nolink = 1; my (%titles,%maptitles); - my $output = '<br /><table><tr><td valign="top">'. - '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b><br />'. - &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef, - (&mt('all'),5,10,20,50,100,1000,10000)). - '</td><td> </td>'; + my $output = '<br /><table><tr><th class="LC_log_filter">'. + '<span class="LC_nobreak"><label for="show">'.&mt('Changes/page:').'</label></span></th>'. + '<th class="LC_log_filter">'.&mt('Window during which changes occurred:').'</th>'; + if (ref($allsymbs) eq 'ARRAY') { + $output.= '<th class="LC_log_filter"><label for="resource">'.&mt('Resource').'</label></th>'. + '<th class="LC_log_filter"><label for="chgcontext">'.&mt('Context').'</label></th>'; + } else { + $output.= '<th class="LC_log_filter"><label for="action">'.&mt('Action').'</label></th>'; + } + $output .= '</tr><tr><td class="LC_log_filter">'. + &Apache::lonmeta::selectbox('show',$curr->{'show'},'','show',undef, + (&mt('all'),5,10,20,50,100,1000,10000)). + '</td>'; my $startform = &Apache::lonhtmlcommon::date_setter($formname,'log_start_date', $curr->{'log_start_date'},undef, @@ -2929,13 +2936,13 @@ sub display_filter { undef,undef,undef,undef,undef,undef,$nolink); my $crstype = &Apache::loncommon::course_type(); my %lt = &reservationlog_contexts($crstype); - $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:'). - '</b><br /><table><tr><td>'.&mt('After:'). - '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'. - $endform.'</td></tr></table></td><td> </td>'; + $output .= '<td class="LC_log_filter"><table><tr><th>'.&mt('After:').'</th>'. + '<td>'.$startform.'</td></tr>'. + '<tr><th>'.&mt('Before:').'</th>'. + '<td>'.$endform.'</td></tr></table>'. + '</td>'; if (ref($allsymbs) eq 'ARRAY') { - $output .= '<td valign="top"><b>'.&mt('Resource').'</b><br />'. - '<select name="resource"><option value="any"'; + $output .= '<td class="LC_log_filter"><select name="resource" id="resource"><option value="any"'; if ($curr->{'resource'} eq 'any') { $output .= ' selected="selected"'; } @@ -2948,8 +2955,8 @@ sub display_filter { } $output .= ' <option value="'.$symb.'"'.$selstr.'>'.$title.'</option>'; } - $output .= '</select></td><td> </td><td valign="top"><b>'. - &mt('Context:').'</b><br /><select name="chgcontext">'; + $output .= '</select></td>'. + '<td class="LC_log_filter"><select name="chgcontext" id="chgcontext">'; foreach my $chgtype ('any','user','manage','parameter') { my $selstr = ''; if ($curr->{'chgcontext'} eq $chgtype) { @@ -2959,8 +2966,7 @@ sub display_filter { } $output .= '</select></td>'; } else { - $output .= '<td valign="top"><b>'.&mt('Action').'</b><br />'. - '<select name="action"><option value="any"'; + $output .= '<td class="LC_log_filter"><select name="action" id="action"><option value="any"'; if ($curr->{'action'} eq 'any') { $output .= ' selected="selected"'; } @@ -2974,7 +2980,7 @@ sub display_filter { } $output .= '</select></td>'; } - $output .= '<td> </td></tr></table>'. + $output .= '</tr></table>'. '<p><input type="submit" value="'. &mt('Update Display').'" /></p>'. '<p class="LC_info">'. @@ -3024,15 +3030,15 @@ sub slot_change_messaging { } sub upload_start { - my ($r)=@_; + my ($r)=@_; $r->print( &Apache::grades::checkforfile_js() - .'<h2>'.&mt('Upload a file containing the slot definitions').'</h2>' + .'<h2 class="LC_heading_2">'.&mt('Upload a file containing the slot definitions').'</h2>' .'<form method="post" enctype="multipart/form-data"' .' action="/adm/slotrequest" name="slotupload">' .'<input type="hidden" name="command" value="csvuploadmap" />' .&Apache::lonhtmlcommon::start_pick_box() - .&Apache::lonhtmlcommon::row_title(&mt('File')) + .&Apache::lonhtmlcommon::row_title('<label for="upfile">'.&mt('File').'</label>') .&Apache::loncommon::upfile_select_html() .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( @@ -3065,7 +3071,7 @@ sub csvuploadmap_header { $r->print( '<form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">' - .'<h2>'.&mt('Identify fields in uploaded list').'</h2>' + .'<h2 class="LC_heading_2">'.&mt('Identify fields in uploaded list').'</h2>' .'<div class="LC_columnSection">' .&Apache::loncommon::help_open_topic( 'Slot About',&mt('Help on slots')) @@ -3477,7 +3483,7 @@ sub handler { if (ref($brcrum) eq 'ARRAY') { push(@{$brcrum},{href=>"/adm/slotrequest?command=showresv",text=>$title}); } - } elsif (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { + } elsif (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { if ($env{'form.command'} eq 'manageresv') { $title = 'Manage Reservations'; $brcrum =[{href=>"/adm/slotrequest?command=manageresv",text=>$title}]; @@ -3520,6 +3526,7 @@ sub handler { $js = &reservation_js(\%slots,$consumed_uniqueperiods,$available,$got_slots,$symb); } &start_page($r,$title,$brcrum,$bread_crumbs_component,$js,$mgr); + $r->print('<div class="LC_landmark" role="main">'."\n"); if ($env{'form.command'} eq 'manageresv') { $allavailable = $available;