--- loncom/interface/slotrequest.pm 2015/10/05 02:35:45 1.131 +++ loncom/interface/slotrequest.pm 2018/01/31 15:28:47 1.137 @@ -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.131 2015/10/05 02:35:45 raeburn Exp $ +# $Id: slotrequest.pm,v 1.137 2018/01/31 15:28:47 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -465,7 +465,7 @@ sub get_consumed_uniqueperiods { return 'error: Unable to determine current status'; } my @problems = $navmap->retrieveResources(undef, - sub { $_[0]->is_problem() },1,0); + sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0); my %used_slots; foreach my $problem (@problems) { my $symb = $problem->symb(); @@ -805,7 +805,7 @@ sub release_reservation { if ($passed_resource->is_map()) { my ($a_resource) = $navmap->retrieveResources($passed_resource, - sub {$_[0]->is_problem()},0,1); + sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1); $symb = $a_resource->symb(); } } else { @@ -1602,15 +1602,16 @@ sub show_table { $r->print('</div>'); $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>'); my $linkstart='<a href="/adm/slotrequest?command=showslots&order='; - $r->print(&Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row().' - <th></th>'); + my $tableheader = &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row().' + <th></th>'; foreach my $which (@show_order) { if ($which ne 'proctor' && exists($show{$which})) { - $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>'); + $tableheader .= '<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>'; } } - $r->print(&Apache::loncommon::end_data_table_header_row()); + $tableheader .= &Apache::loncommon::end_data_table_header_row(); + my $shownheader = 0; my %name_cache; my $slotsort = sub { @@ -1767,30 +1768,39 @@ sub show_table { delete => 'Delete', slotlog => 'History', ); - my $edit=(<<"EDITLINK"); + my ($edit,$delete,$showlog,$remove_all); + if ($mgr) { + $edit=(<<"EDITLINK"); <a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a> EDITLINK - my $delete=(<<"DELETELINK"); + $delete=(<<"DELETELINK"); <a href="/adm/slotrequest?command=delete&slotname=$slot">$lt{'delete'}</a> DELETELINK - my $showlog=(<<"LOGLINK"); + $remove_all=&remove_link($slot,'remove all').'<br />'; + + if ($ids eq '') { + undef($remove_all); + } else { + undef($delete); + } + } + + $showlog=(<<"LOGLINK"); <a href="/adm/slotrequest?command=slotlog&slotname=$slot">$lt{'slotlog'}</a> LOGLINK - my $remove_all=&remove_link($slot,'remove all').'<br />'; - - if ($ids eq '') { - undef($remove_all); - } else { - undef($delete); - } if ($slots{$slot}{'type'} ne 'schedulable_student') { undef($showlog); undef($remove_all); } + unless ($shownheader) { + $r->print($tableheader); + $shownheader = 1; + } + my $row_start=&Apache::loncommon::start_data_table_row(); my $row_end=&Apache::loncommon::end_data_table_row(); $r->print($row_start. @@ -1869,12 +1879,18 @@ $row_end STUFF } } - $r->print(&Apache::loncommon::end_data_table().'</form>'); + if ($shownheader) { + $r->print(&Apache::loncommon::end_data_table()); + } else { + $r->print('<p>'.&mt('No slots meet the criteria for display').'</p>'); + } + $r->print('</form>'); return; } sub manage_reservations { my ($r,$crstype,$slots,$consumed_uniqueperiods,$allavailable) = @_; + my ($cnum,$cdom)=&get_course(); my $navmap = Apache::lonnavmaps::navmap->new(); $r->print('<p>' .&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.') @@ -1906,9 +1922,107 @@ sub manage_reservations { '</span>'); return; } - my (%parent,%shownparent,%container,%container_title,%contents); - my ($depth,$count,$reservable,$lastcontainer,$rownum,$shown) = (0,0,0,0,0,0); - my @backgrounds = ("LC_odd_row","LC_even_row"); + my (%output,%slotinfo,%statusbymap,%repsymbs,%shownmaps); + my @possibles = $navmap->retrieveResources(undef, + sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0); + + foreach my $resource (@possibles) { + my ($useslots) = $resource->slot_control(); + next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i)); + my $symb = $resource->symb(); + my ($slot_status,$date,$slot_name) = $resource->check_for_slot('0'); + my ($msg,$get_choices,$slotdescription); + my $status = $resource->simpleStatus('0'); + my ($msg,$get_choices,$slotdescription); + if ($slot_name ne '') { + my %slot=&Apache::lonnet::get_slot($slot_name); + $slotdescription=&get_description($slot_name,\%slot); + } + if ($slot_status == $resource->NOT_IN_A_SLOT) { + $msg=&mt('No current reservation.'); + $get_choices = 1; + } elsif ($slot_status == $resource->NEEDS_CHECKIN) { + $msg='<span class="LC_nobreak">'.&mt('Reserved:'). + ' '.$slotdescription.'</span><br />'. + &mt('Access requires proctor validation.'); + } elsif ($slot_status == $resource->WAITING_FOR_GRADE) { + $msg=&mt('Submitted and currently in grading queue.'); + } elsif ($slot_status == $resource->CORRECT) { + $msg=&mt('Problem is unavailable.'); + } elsif ($slot_status == $resource->RESERVED) { + $msg='<span class="LC_nobreak">'.&mt('Reserved:'). + ' '.$slotdescription.'</span><br />'. + &mt('Problem is currently available.'); + } elsif ($slot_status == $resource->RESERVED_LOCATION) { + $msg='<span class="LC_nobreak">'.&mt('Reserved:'). + ' '.$slotdescription.'</span><br />'. + &mt('Problem is available at a different location.'); + $get_choices = 1; + } elsif ($slot_status == $resource->RESERVED_LATER) { + $msg='<span class="LC_nobreak">'.&mt('Reserved:'). + ' '.$slotdescription.'</span><br />'. + &mt('Problem will be available later.'); + $get_choices = 1; + } elsif ($slot_status == $resource->RESERVABLE) { + $msg=&mt('Reservation needed'); + $get_choices = 1; + } elsif ($slot_status == $resource->RESERVABLE_LATER) { + $msg=&mt('Reservation needed: will be reservable later.'); + } elsif ($slot_status == $resource->NOTRESERVABLE) { + $msg=&mt('Reservation needed: none available.'); + } elsif ($slot_status == $resource->UNKNOWN) { + $msg=&mt('Unable to determine status due to network problems.'); + } else { + if ($status != $resource->OPEN) { + $msg = &Apache::lonnavmaps::getDescription($resource,'0'); + } + } + $output{$symb}{'msg'} = $msg; + if (($status == $resource->OPEN) && ($get_choices)) { + $output{$symb}{'hasaction'} = 1; + } + my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb); + $mapurl = &Apache::lonnet::clutter($mapurl); + unless ($mapurl =~ /default\.sequence$/) { + $shownmaps{$mapurl} = 1; + my $map = $navmap->getResourceByUrl($mapurl); + if (ref($map)) { + my @pcs = split(/,/,$map->map_hierarchy()); + shift(@pcs); + shift(@pcs); + if (@pcs) { + map { $shownmaps{$navmap->getByMapPc($_)->src()} = 1; } reverse(@pcs); + } + } + } + if (($useslots eq 'map_map') || ($useslots eq 'map')) { + if ($slot_status ne '') { + if (ref($statusbymap{$mapurl}{$slot_status}) eq 'ARRAY') { + push(@{$statusbymap{$mapurl}{$slot_status}},$symb); + } else { + $statusbymap{$mapurl}{$slot_status} = [$symb]; + } + } + } + } + + foreach my $mapurl (keys(%statusbymap)) { + if (ref($statusbymap{$mapurl}) eq 'HASH') { + if (keys(%{$statusbymap{$mapurl}}) == 1) { + my @values = values(%{$statusbymap{$mapurl}}); + my $repsymb = $values[0][0]; + if (ref($output{$repsymb}) eq 'HASH') { + $output{$mapurl}{'msg'} = $output{$repsymb}{'msg'}; + $output{$mapurl}{'hasaction'} = $output{$repsymb}{'hasaction'}; + } + $repsymbs{$mapurl} = $repsymb; + } + } + } + + my (%parent,%container,%container_title); + my ($depth,$count,$reservable,$currcontainer,$rownum,$mapnum,$shown) = (0,0,0,0,0,0,0); + my @backgrounds = ("LC_even_row","LC_odd_row"); my $numcolors = scalar(@backgrounds); my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif"); my $slotheader = '<p>'. @@ -1916,254 +2030,125 @@ sub manage_reservations { '</p>'. '<table class="LC_data_table LC_tableOfContent" id="LC_slot_reservations">'."\n"; my $shownheader = 0; + my $currmap; my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef); - my (@ordered,%output,$mapitem,$got_map_slot,$currmapoutput,$mapnum); - $mapnum = 0; - $shown = 0; while (my $resource = $it->next()) { if ($resource == $it->BEGIN_MAP()) { $depth++; - $parent{$depth} = $lastcontainer; - } - if ($resource == $it->END_MAP()) { - $depth--; - $lastcontainer = $parent{$depth}; - my %allstatuses; - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - if (($output{$symb}{'type'} eq 'map_map') || ($output{$symb}{'type'} eq 'map')) { - if ($output{$symb}{'slotstatus'} ne '') { - if (ref($allstatuses{$output{$symb}{'slotstatus'}}) eq 'ARRAY') { - push(@{$allstatuses{$output{$symb}{'slotstatus'}}},$symb); + $parent{$depth} = $currcontainer; + if (ref($container{$currcontainer})) { + my $currmapres = $container{$currcontainer}; + my $currmaptitle = $container_title{$currcontainer}; + $currmap = $currmapres->src(); + my $currmaptype = 'sequence'; + if ($currmapres->is_page()) { + $currmaptype = 'page'; + } + if ($shownmaps{$currmap}) { + $mapnum ++; + $rownum ++; + $shown ++; + if (!$shownheader) { + $r->print($slotheader); + $shownheader = 1; + } + my $bgcolor = $backgrounds[$shown % $numcolors]; + my ($spacers,$icon); + my $row = '<tr class="'.$bgcolor.'" id="LC_slotmaprow_'.$rownum.'">'; + if (ref($statusbymap{$currmap}) eq 'HASH') { + my ($spacers,$icon) = &show_map_row($depth-1,$location,$currmaptype,$currmaptitle); + my $arrowstate = 'open'; + if (keys(%{$statusbymap{$currmap}}) == 1) { + $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');".'" />'. + $icon.(' ' x6).'</td>'."\n"; + if (ref($output{$currmap}) eq 'HASH') { + my $formnum = $mapnum.'_'.$reservable+1; + my $class = 'LC_slotmaptext_'.$mapnum; + if ($output{$currmap}{'hasaction'}) { + $row .= '<td valign="top"><span class="'.$class.'">'. + $output{$currmap}{'msg'}. + '</span></td><td valign="top">'. + &slot_chooser($repsymbs{$currmap},$class,$formnum, + $allavailable,$slots,$consumed_uniqueperiods). + '</td>'; } else { - $allstatuses{$output{$symb}{'slotstatus'}} = [$symb]; + $row .= '<td colspan="2" valign="middle"><span class="'.$class.'">'. + $output{$currmap}{'msg'}. + '</span></td>'; } + $row .= '</tr>'."\n"; + } else { + $row .= '<td colspan="2"> </td></tr>'."\n"; } - } - } - } - if (keys(%allstatuses) == 1) { - $got_map_slot = 1; - my $repsymb; - my @values = values(%allstatuses); - if (ref($values[0]) eq 'ARRAY') { - if (ref($output{$values[0][0]}) eq 'HASH') { - $repsymb = $values[0][0]; - } - } - if (($mapitem) && ($repsymb)) { - my $formnum = $mapnum.'_'.$output{$repsymb}{'reservable'}; - my $class = 'LC_slotmaptext_'.$mapnum; - if ($output{$repsymb}{'hasaction'}) { - $mapitem .= '<td valign="top"><span class="'.$class.'">'. - $output{$repsymb}{'msg'}. - '</span></td><td valign="top">'. - &slot_chooser($repsymb,$class,$formnum,$allavailable,$slots, - $consumed_uniqueperiods). - '</td>'; - } else { - $mapitem .= '<td colspan="2" valign="middle"><span class="'.$class.'">'. - $output{$repsymb}{'msg'}. - '</span></td>'; - } - } - my $counter = 0; - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - $counter ++; - my $bgcolor = $backgrounds[($output{$symb}{'shown'} + $counter) % $numcolors]; - $currmapoutput .= $output{$symb}{'header'}. - '<tr class="'.$bgcolor.' LC_slotresrow_'.$output{$symb}{'mapnum'}.'"'. - ' style="display:none" id="LC_slotresrow_'.$output{$symb}{'rownum'}.'">'. - $output{$symb}{'info'}. - $output{$symb}{'data'}.'</tr>'."\n"; - } - } - } else { - my $counter = 0; - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - $counter ++; - my $bgcolor = $backgrounds[($output{$symb}{'shown'} + $counter) % $numcolors]; - $currmapoutput .= $output{$symb}{'header'}. - '<tr class="'.$bgcolor.' LC_slotresrow_'.$output{$symb}{'mapnum'}.'"'. - ' style="display:table-row" id="LC_slotresrow_'.$output{$symb}{'rownum'}.'">'. - $output{$symb}{'info'}. - $output{$symb}{'data'}.'</tr>'."\n"; - $shown ++; + my ($spacers,$icon) = &show_map_row($depth,$location,$currmaptype,$currmaptitle); + $row .= '<td>'.$spacers.$icon.(' ' x6).'</td><td colspan="2"> </td></tr>'."\n"; } + $r->print($row); } } - if ($mapitem) { - if ($got_map_slot) { - $mapitem =~ s{(<img src=\"/adm/lonIcons/arrow\.)open(\.gif\")}{$1closed$2}; - $mapitem .= '</tr>'."\n"; - } else { - $mapitem .= '<td colspan="2"> </td></tr>'."\n"; - } - } - $r->print($mapitem.$currmapoutput); - @ordered=(); - undef(%output); - $currmapoutput = ''; - $got_map_slot = ''; - $mapitem = ''; - } - if (ref($resource)) { + } elsif ($resource == $it->END_MAP()) { + $depth--; + $currcontainer = $parent{$depth}; + } elsif (ref($resource)) { my $symb = $resource->symb(); - $contents{$lastcontainer} ++; - next if (!$resource->is_problem() && !$resource->is_sequence() && - !$resource->is_page()); + next if (!$resource->is_problem() && !$resource->is_tool() && + !$resource->is_sequence() && !$resource->is_page()); $count ++; if (($resource->is_sequence()) || ($resource->is_page())) { - $lastcontainer = $count; - $container{$lastcontainer} = $resource; - $container_title{$lastcontainer} = $resource->compTitle(); - } - if ($resource->is_problem()) { - my ($useslots) = $resource->slot_control(); - next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i)); - push(@ordered,$symb); - $output{$symb}{type} = $useslots; - my ($msg,$get_choices,$slotdescription); - my $title = $resource->compTitle(); - my $status = $resource->simpleStatus('0'); - my ($slot_status,$date,$slot_name) = $resource->check_for_slot('0'); - - $output{$symb}{'slotstatus'} = $slot_status; - $output{$symb}{'slotname'} = $slot_name; - if ($slot_name ne '') { - my %slot=&Apache::lonnet::get_slot($slot_name); - $slotdescription=&get_description($slot_name,\%slot); - } - if ($slot_status == $resource->NOT_IN_A_SLOT) { - $msg=&mt('No current reservation.'); - $get_choices = 1; - } elsif ($slot_status == $resource->NEEDS_CHECKIN) { - $msg='<span class="LC_nobreak">'.&mt('Reserved:'). - ' '.$slotdescription.'</span><br />'. - &mt('Access requires proctor validation.'); - } elsif ($slot_status == $resource->WAITING_FOR_GRADE) { - $msg=&mt('Submitted and currently in grading queue.'); - } elsif ($slot_status == $resource->CORRECT) { - $msg=&mt('Problem is unavailable.'); - } elsif ($slot_status == $resource->RESERVED) { - $msg='<span class="LC_nobreak">'.&mt('Reserved:'). - ' '.$slotdescription.'</span><br />'. - &mt('Problem is currently available.'); - } elsif ($slot_status == $resource->RESERVED_LOCATION) { - $msg='<span class="LC_nobreak">'.&mt('Reserved:'). - ' '.$slotdescription.'</span><br />'. - &mt('Problem is available at a different location.'); - $get_choices = 1; - } elsif ($slot_status == $resource->RESERVED_LATER) { - $msg='<span class="LC_nobreak">'.&mt('Reserved:'). - ' '.$slotdescription.'</span><br />'. - &mt('Problem will be available later.'); - $get_choices = 1; - } elsif ($slot_status == $resource->RESERVABLE) { - $msg=&mt('Reservation needed'); - $get_choices = 1; - } elsif ($slot_status == $resource->RESERVABLE_LATER) { - $msg=&mt('Reservation needed: will be reservable later.'); - } elsif ($slot_status == $resource->NOTRESERVABLE) { - $msg=&mt('Reservation needed: none available.'); - } elsif ($slot_status == $resource->UNKNOWN) { - $msg=&mt('Unable to determine status due to network problems.'); - } else { - if ($status != $resource->OPEN) { - $msg = &Apache::lonnavmaps::getDescription($resource,'0'); - } - } - $output{$symb}{'msg'} = $msg; + $currcontainer = $count; + $container{$currcontainer} = $resource; + $container_title{$currcontainer} = $resource->compTitle(); + } + if (($resource->is_problem() || $resource->is_tool)) { + next unless (exists($output{$symb})); $reservable ++; - $output{$symb}{'reservable'} = $reservable; - my $treelevel = $depth; - my $higherup = $lastcontainer; - if ($depth > 1) { - my @maprows; - while ($treelevel > 1) { - if (ref($container{$higherup})) { - my $res = $container{$higherup}; - last if (defined($shownparent{$higherup})); - my $maptitle = $res->compTitle(); - my $type = 'sequence'; - if ($res->is_page()) { - $type = 'page'; - } - &show_map_row($treelevel,$location,$type,$maptitle, - \@maprows); - $shownparent{$higherup} = 1; - } - $treelevel --; - $higherup = $parent{$treelevel}; - } - for (my $i=0; $i<@maprows; $i++) { - $mapnum ++; - $rownum ++; - $shown ++; - my $bgcolor = $backgrounds[$shown % $numcolors]; - if (!$shownheader) { - $mapitem .= $slotheader; - $shownheader = 1; - } - if (ref($maprows[$i]) eq 'ARRAY') { - if ($i < scalar(@maprows)-1) { - $mapitem .= '<tr class="'.$bgcolor.'" id="LC_slotmaprow_'.$rownum.'">'. - '<td>'.join('',@{$maprows[$i]}).'</td>'. - '<td colspan="2"> </td></tr>'."\n"; - } else { - $mapitem .= - '<tr class="'.$bgcolor.'" id="LC_slotmaprow_'.$rownum.'">'. - '<td>'.$maprows[$i][0]. - '<img src="/adm/lonIcons/arrow.open.gif" id="arrow'.$mapnum.'" '. - 'alt="arrow" onmouseover="this.style.cursor=\'pointer\'" '. - 'onclick="'."toggleSlotMap('$mapnum','$rownum');".'" />'. - $maprows[$i][1].(' ' x6).'</td>'."\n"; - } - } - } - $output{$symb}{'mapnum'} = $mapnum; - } $rownum ++; - $output{$symb}{'rownum'} = $rownum; - $output{$symb}{'shown'} = $shown; if (!$shownheader) { - $output{$symb}{'header'} = $slotheader; + $r->print($slotheader); $shownheader = 1; } - $output{$symb}{'info'} = '<td>'; + my $style; + if (exists($output{$currmap})) { + $style = 'none'; + } else { + $style = 'table-row'; + $shown ++; + } + my $title = $resource->compTitle(); + my $bgcolor = $backgrounds[$shown % $numcolors]; + $r->print('<tr class="'.$bgcolor.' LC_slotresrow_'.$mapnum.'"'. + ' style="display:'.$style.'" id="LC_slotresrow_'.$rownum.'">'. + '<td>'); for (my $i=0; $i<$depth; $i++) { - $output{$symb}{'info'} .= '<img src="'.$location.'" alt="" />'; + $r->print('<img src="'.$location.'" alt="" />'); } - $output{$symb}{'info'} .= '<a href="'.$resource->src().'?symb='.$symb.'">'. - '<img class="LC_contentImage" src="/adm/lonIcons/'; + $r->print('<a href="'.$resource->src().'?symb='.$symb.'">'. + '<img class="LC_contentImage" src="/adm/lonIcons/'); if ($resource->is_task()) { - $output{$symb}{'info'} .= 'task.gif" alt="'.&mt('Task'); + $r->print('task.gif" alt="'.&mt('Task')); + } elsif ($resource->is_tool()) { + $r->print('unknown.gif" alt="'.&mt('External Tool')); } else { - $output{$symb}{'info'} .= 'problem.gif" alt="'.&mt('Problem'); - } - $output{$symb}{'info'} .= '" /><b>'.$title.'</b></a>'.(' ' x6).'</td>'; - - my $hasaction; - if ($status == $resource->OPEN) { - if ($get_choices) { - $hasaction = 1; - $output{$symb}{'hasaction'} = $hasaction; - } + $r->print('problem.gif" alt="'.&mt('Problem')); } + $r->print('" /><b>'.$title.'</b></a>'.(' ' x6).'</td>'); my $class = 'LC_slottext_'.$mapnum; - if ($hasaction) { - $output{$symb}{'data'} = '<td valign="top"><span class="'.$class.'">'.$msg.'</span></td>'. - '<td valign="top">'. - &slot_chooser($symb,$class,$reservable,$allavailable,$slots, - $consumed_uniqueperiods).'</td>'; + if ($output{$symb}{'hasaction'}) { + $r->print('<td valign="top"><span class="'.$class.'">'.$output{$symb}{'msg'}.'</span></td>'. + '<td valign="top">'. + &slot_chooser($symb,$class,$reservable,$allavailable,$slots, + $consumed_uniqueperiods).'</td>'); } else { - $output{$symb}{'data'} = '<td colspan="2" valign="middle">'. - '<span class="'.$class.'">'.$msg.'</span>'. - '</td>'; + $r->print('<td colspan="2" valign="middle">'. + '<span class="'.$class.'">'.$output{$symb}{'msg'}.'</span>'. + '</td>'); } + $r->print('</tr>'."\n"); } } } @@ -2184,9 +2169,9 @@ sub manage_reservations { } sub show_map_row { - my ($depth,$location,$type,$title,$maprows) = @_; + my ($depth,$location,$type,$title) = @_; my $spacers; - for (my $i=0; $i<$depth-2; $i++) { + for (my $i=0; $i<$depth-1; $i++) { $spacers .= '<img src="'.$location.'" alt="" />'; } my $icon; @@ -2196,8 +2181,7 @@ sub show_map_row { $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" /> '."\n"; } $icon .= $title; - unshift (@{$maprows},[$spacers,$icon]); - return; + return ($spacers,$icon); } sub slot_chooser { @@ -2258,8 +2242,7 @@ sub show_reservations { $udom = $env{'user.domain'}; } my $formname = 'slotlog'; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($cnum,$cdom)=&get_course(); my $crstype = &Apache::loncommon::course_type(); my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname); if ($env{'form.origin'} eq 'aboutme') { @@ -2360,14 +2343,16 @@ sub show_reservations { if ($showntablehdr) { $r->print(&Apache::loncommon::end_data_table().'<br />'); if (($curr{'page'} > 1) || ($more_records)) { - $r->print('<table><tr>'); + $r->print('<p>'); if ($curr{'page'} > 1) { - $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>'); + $r->print('<input type="button" onclick="javascript:chgPage('."'previous'".');" value="'. + &mt('Previous [_1] changes',$curr{'show'}).'" />'); } if ($more_records) { - $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>'); + $r->print('<input type="button" onclick="javascript:chgPage('."'next'".');" value="'. + &mt('Next [_1] changes',$curr{'show'}).'" />'); } - $r->print('</tr></table>'); + $r->print('</p>'); $r->print(<<"ENDSCRIPT"); <script type="text/javascript"> // <![CDATA[ @@ -2432,8 +2417,7 @@ sub show_reservations_log { return; } my $formname = 'reservationslog'; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($cnum,$cdom)=&get_course(); my %slotlog=&Apache::lonnet::dump('nohist_slotreservationslog',$cdom,$cnum); if ((keys(%slotlog))[0]=~/^error\:/) { undef(%slotlog); } @@ -2571,14 +2555,16 @@ sub show_reservations_log { if ($showntablehdr) { $r->print(&Apache::loncommon::end_data_table().'<br />'); if (($curr{'page'} > 1) || ($more_records)) { - $r->print('<table><tr>'); + $r->print('<p>'); if ($curr{'page'} > 1) { - $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>'); + $r->print('<input type="button" onclick="javascript:chgPage('."'previous'".');" value="'. + &mt('Previous [_1] changes',$curr{'show'}).'" />'); } if ($more_records) { - $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>'); + $r->print('<input type="button" onclick="javascript:chgPage('."'next'".');" value="'. + &mt('Next [_1] changes',$curr{'show'}).'" />'); } - $r->print('</tr></table>'); + $r->print('</p>'); $r->print(<<"ENDSCRIPT"); <script type="text/javascript"> function chgPage(caller) { @@ -2718,8 +2704,9 @@ sub display_filter { } $output .= '</select></td>'; } - $output .= '<td> </td><td valign="middle"><input type="submit" value="'. - &mt('Update Display').'" /></tr></table>'. + $output .= '<td> </td></tr></table>'. + '<p><input type="submit" value="'. + &mt('Update Display').'" /></p>'. '<p class="LC_info">'. &mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.' ,'2.9.0'); @@ -2925,8 +2912,10 @@ sub csv_upload_map { if (!$env{'form.datatoken'}) { $datatoken=&Apache::loncommon::upfile_store($r); } else { - $datatoken=$env{'form.datatoken'}; - &Apache::loncommon::load_tmp_file($r); + $datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'}); + if ($datatoken ne '') { + &Apache::loncommon::load_tmp_file($r,$datatoken); + } } my @records=&Apache::loncommon::upfile_record_sep(); if ($env{'form.noFirstLine'}) { shift(@records); } @@ -2977,7 +2966,10 @@ sub csvupload_fields { sub csv_upload_assign { my ($r,$mgr)= @_; - &Apache::loncommon::load_tmp_file($r); + my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'}); + if ($datatoken ne '') { + &Apache::loncommon::load_tmp_file($r,$datatoken); + } my @slotdata = &Apache::loncommon::upfile_record_sep(); if ($env{'form.noFirstLine'}) { shift(@slotdata); } my %fields=&Apache::grades::get_fields(); @@ -3035,8 +3027,12 @@ sub csv_upload_assign { } if ($entries{$fields{'startreserve'}}) { - $slot{'startreserve'}= - &UnixDate($entries{$fields{'startreserve'}},"%s"); + my $date = &UnixDate($entries{$fields{'startreserve'}},"%s"); + if ($date eq '') { + push(@errors,"$name -- No reservation start time set for slot -- value provided had invalid format"); + } else { + $slot{'startreserve'} = $date; + } } if (defined($slot{'startreserve'}) && $slot{'startreserve'} > $slot{'starttime'}) { @@ -3045,8 +3041,12 @@ sub csv_upload_assign { } if ($entries{$fields{'endreserve'}}) { - $slot{'endreserve'}= - &UnixDate($entries{$fields{'endreserve'}},"%s"); + my $date = &UnixDate($entries{$fields{'endreserve'}},"%s"); + if ($date eq '') { + push(@errors,"$name -- No reservation end time set for slot -- value provided had invalid format"); + } else { + $slot{'endreserve'} = $date; + } } if (defined($slot{'endreserve'}) && $slot{'endreserve'} > $slot{'starttime'}) { @@ -3111,12 +3111,14 @@ sub csv_upload_assign { } } if ($entries{$fields{'uniqueperiod'}}) { - my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}}); - my @times=(&UnixDate($start,"%s"), - &UnixDate($end,"%s")); - $slot{'uniqueperiod'}=\@times; + my ($start,$end)= map { &UnixDate($_,"%s"); } split(',',$entries{$fields{'uniqueperiod'}}); + if (($start ne '') && ($end ne '')) { + $slot{'uniqueperiod'}=[$start,$end]; + } else { + push(@errors,"$name -- Slot's unique period ignored -- one or both of the comma separated values for start and end had an invalid format"); + } } - if (defined($slot{'uniqueperiod'}) + if (ref($slot{'uniqueperiod'}) eq 'ARRAY' && $slot{'uniqueperiod'}[0] > $slot{'uniqueperiod'}[1]) { push(@errors,"$name not created -- Slot's unique period start time is later than the unique period's end time."); next; @@ -3279,7 +3281,7 @@ sub handler { } &csv_upload_map($r); } - } elsif ($env{'form.command'} eq 'slotlog' && $mgr eq 'F') { + } elsif (($env{'form.command'} eq 'slotlog') && ($vgr eq 'F')) { &show_reservations_log($r); } else { my $symb=&unescape($env{'form.symb'});