--- loncom/interface/slotrequest.pm 2015/09/25 02:03:29 1.127
+++ loncom/interface/slotrequest.pm 2023/03/29 16:01:13 1.144
@@ -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.127 2015/09/25 02:03:29 raeburn Exp $
+# $Id: slotrequest.pm,v 1.144 2023/03/29 16:01:13 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -56,10 +56,13 @@ sub fail {
}
sub start_page {
- my ($r,$title,$brcrum,$js)=@_;
+ my ($r,$title,$brcrum,$bread_crumbs_component,$js)=@_;
my $args;
if (ref($brcrum) eq 'ARRAY') {
$args = {bread_crumbs => $brcrum};
+ if ($bread_crumbs_component) {
+ $args->{bread_crumbs_component} = $bread_crumbs_component;
+ }
}
if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) {
my %loaditems = (
@@ -162,9 +165,24 @@ $js
var startdate = startm+"/"+startd+"/"+starty;
var starttime = new Date(startdate).getTime();
starttime = starttime/1000;
+ var starth = form.start_hour.options[form.start_hour.selectedIndex].value;
+ if (numberRegExp.test(starth)) {
+ starth = parseInt(starth);
+ if (starth > 0 && starth <= 23) {
+ starttime += 3600 * starth;
+ }
+ }
var enddate = endm+"/"+endd+"/"+endy;
var endtime = new Date(enddate).getTime();
endtime = endtime/1000;
+ var endh = form.end_hour.options[form.end_hour.selectedIndex].value;
+ if (numberRegExp.test(endh)) {
+ endh = parseInt(endh);
+ if (endh > 0 && endh <= 23) {
+ endtime += 3600 * endh;
+ }
+ }
+
var shown = 0;
for (var i=0; i<$i; i++) {
if ((slotstart[i] >= starttime) && (slotend[i] <= endtime)) {
@@ -246,7 +264,7 @@ function uncheckSlotRadio() {
}
}
-function toggleSlotMap(maprownum) {
+function toggleSlotMap(maprownum,rownum) {
if (document.getElementById('arrow'+maprownum)) {
var img = document.getElementById('arrow'+maprownum);
var rowdisplay;
@@ -263,20 +281,81 @@ function toggleSlotMap(maprownum) {
var resrows;
var maptext;
if (document.getElementsByClassName) {
- resrows = document.getElementsByClassName('LC_slotmaprow_'+maprownum);
+ resrows = document.getElementsByClassName('LC_slotresrow_'+maprownum);
maptext = document.getElementsByClassName('LC_slotmaptext_'+maprownum);
} else {
- resrows = getElementsByClassName(document.body,'LC_slotmaprow_'+maprownum);
+ resrows = getElementsByClassName(document.body,'LC_slotresrow_'+maprownum);
maptext = getElementsByClassName(document.body,'LC_slotmaptext_'+maprownum);
}
+ if (maptext.length) {
+ for (var i=0; i '.&mt($msg).' '.&mt($msg).' $msg '.&mt($msg).' '.&mt($msg).' $msg '.&mt('Slot [_1] marked as deleted.',''.$slot_name.'').' '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) '
+ $r->print(' '
.&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
- .'';
+ if (keys(%folders)) {
+ $msg .= '
';
+ }
+ $msg .= '';
+ my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ my $subject = &mt('Reservation change: [_1]',$description);
+ my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
+ $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
+ return (1,$msg);
+ } else {
+ if (keys(%to_delete)) {
+ $msg = &mt('Reservation release partially complete for [_1]',$description);
+ } else {
+ $msg = &mt('No entries found for this user to release for [_1].',$description);
+ }
+ return (0,$msg);
+ }
+ } else {
+ $msg = &mt('No conflict found; not releasing: [_1].',$description);
+ return (0,$msg);
+ }
+ }
+
+ my $map_symb;
+ my $parm_symb = $symb;
my $passed_resource = $navmap->getBySymb($symb);
+
+ # if the reservation symb is for a map get a resource in that map
+ # to check slot parameters on
+ my $parm_level = 1;
if (ref($passed_resource)) {
if ($passed_resource->is_map()) {
my ($a_resource) =
$navmap->retrieveResources($passed_resource,
- sub {$_[0]->is_problem()},0,1);
- $symb = $a_resource->symb();
+ sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);
+ $parm_symb = $a_resource->symb();
}
} else {
unless ($mgr eq 'F') {
@@ -738,68 +975,132 @@ sub release_reservation {
}
}
- # get parameter string, check for existence, rebuild string with the slot
- my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
- $symb,$udom,$uname);
- my @slots = split(/:/,$student);
-
- my @new_slots;
- foreach my $exist_slot (@slots) {
- if ($exist_slot eq $slot_name) { next; }
- push(@new_slots,$exist_slot);
+ # Get value of useslots parameter in effect for this user.
+ # If value is map or map_map, then the parm level is 2 (i.e.,
+ # non-recursive enclosing map/folder level for specific user)
+ # and the symb for this reservation in slot_reservations.db
+ # will be the symb of the map itself.
+
+ my $use_slots = &Apache::lonnet::EXT('resource.0.useslots',
+ $parm_symb,$udom,$uname);
+ if (&Apache::lonnet::error($use_slots)) {
+ return (0,'error: Unable to determine current status');
+ }
+ if ($use_slots eq 'map' || $use_slots eq 'map_map') {
+ $parm_level = 2;
+ if ($passed_resource->is_map()) {
+ $map_symb = $passed_resource->symb();
+ } else {
+ my ($map) = &Apache::lonnet::decode_symb($symb);
+ $map_symb = &Apache::lonnet::symbread($map);
+ }
}
- my $new_param = join(':',@new_slots);
- my ($cnum,$cdom)=&get_course();
+ #
+ # If release is *not* because of a reservation change, i.e., this is a "drop"
+ # by a student, or a removal for a single student by an instructor then
+ # only remove one entry from slot_reservations.db, where both the user
+ # and the symb match the current context. If useslots was set to map or
+ # map_map, then the symb to match in slot_reservations.db is the symb of
+ # the enclosing map/folder, not the symb of the resource.
+ #
- # get slot reservations, check if user has one, if so remove reservation
- my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
- "^$slot_name\0");
+ my ($match,$symb_to_check);
+ if ($parm_level == 2) {
+ $symb_to_check = $map_symb;
+ } else {
+ $symb_to_check = $parm_symb;
+ }
foreach my $entry (keys(%consumed)) {
- if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
- &Apache::lonnet::del('slot_reservations',[$entry],
- $cdom,$cnum);
- my %storehash = (
- symb => $symb,
- slot => $slot_name,
- action => 'release',
- context => $env{'form.context'},
- );
- &Apache::lonnet::write_log('slotreservationslog',\%storehash,
- 1,$uname,$udom,$cnum,$cdom);
- &Apache::lonnet::write_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
- 1,$uname,$udom,$uname,$udom);
- }
+ if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
+ if ($consumed{$entry}->{'symb'} eq $symb_to_check) {
+ if (&Apache::lonnet::del('slot_reservations',[$entry],
+ $cdom,$cnum) eq 'ok') {
+ $match = $symb_to_check;
+ }
+ last;
+ }
+ }
+ }
+ if ($match) {
+ if (&update_selectable($navmap,$slot_name,$symb,$cdom,
+ $cnum,$udom,$uname,$context) =~ /^error/) {
+ if ($mgr eq 'F') {
+ $msg = &mt('Reservation release partially complete for: [_1]',"$uname:$udom").'';
+ foreach my $key (sort { $container{$b}{'title'} cmp $container{$a}{'title'} } (keys(%container))) {
+ if (ref($container{$key}{'resources'}) eq 'HASH') {
+ $msg .= '
'.
+ &mt('Update of availablestudent parameter for [_1] was not completed.',"$uname:$udom");
+ } else {
+ $msg = &mt('Release partially complete for: [_1]',$description);
+ }
+ return (0,$msg);
+ } else {
+ if ($mgr eq 'F') {
+ $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
+ } else {
+ $msg = ''.&mt('Released reservation: [_1]',$description).'
';
+ my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ my $subject = &mt('Reservation change: [_1]',$description);
+ my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
+ $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
+ }
+ return (1,$msg);
+ }
+ } else {
+ $msg = &mt('Release failed for: [_1]',$description);
+ return (0,$msg);
+ }
+}
+
+sub update_selectable {
+ my ($navmap,$slot_name,$symb,$cdom,$cnum,$udom,$uname,$context) = @_;
+ return 'error: ' unless (ref($navmap));
+ my $symb_for_parm = $symb;
+ my $passed_resource = $navmap->getBySymb($symb);
+ return 'error: invalid symb' unless (ref($passed_resource));
+
+ # if the reservation symb is for a map get a resource in that map
+ # to check slot parameters on
+ if ($passed_resource->is_map()) {
+ my ($a_resource) =
+ $navmap->retrieveResources($passed_resource,
+ sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);
+ $symb_for_parm = $a_resource->symb();
}
+ # get parameter string, check for existence, rebuild string with the slot
+ my $student = &Apache::lonnet::EXT('resource.0.availablestudent',
+ $symb_for_parm,$udom,$uname);
+
+ # Get value of useslots parameter in effect for this user.
+ # If value is map or map_map, then the parm level is 2 (i.e.,
+ # non-recursive enclosing map/folder level for specific user)
+ # and the symb for this reservation in slot_reservations.db
+ # will be the symb of the map itself.
- my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
- $symb,$udom,$uname);
+ my $use_slots = &Apache::lonnet::EXT('resource.0.useslots',
+ $symb_for_parm,$udom,$uname);
&Apache::lonxml::debug("use_slots is $use_slots
");
- if (&Apache::lonnet::error($use_slots)) {
- return (0,'error: Unable to determine current status');
+ if (&Apache::lonnet::error($use_slots)) {
+ return 'error: Unable to determine current status';
}
my $parm_level = 1;
if ($use_slots eq 'map' || $use_slots eq 'map_map') {
- $parm_level = 2;
+ $parm_level = 2;
}
- # store new parameter string
- my $result=&Apache::lonparmset::storeparm_by_symb($symb,
- '0_availablestudent',
- $parm_level, $new_param,
- 'string', $uname, $udom);
- my $msg;
- if ($mgr eq 'F') {
- $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
- } else {
- $msg = ''.&mt('Released reservation: [_1]',$description).'
';
- my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
- my $subject = &mt('Reservation change: [_1]',$description);
- my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
- $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
+
+ my @slots = split(/:/,$student);
+
+ my @new_slots;
+ foreach my $exist_slot (@slots) {
+ next if ($exist_slot eq $slot_name);
+ push(@new_slots,$exist_slot);
}
- return (1,$msg);
+ my $new_value = join(':',@new_slots);
+
+ my $result = &store_slot_parm($symb_for_parm,$symb,$slot_name,$parm_level,
+ $new_value,$cnum,$cdom,$uname,$udom,'release',
+ $context,1);
+ return $result;
}
sub delete_slot {
@@ -821,7 +1122,7 @@ sub delete_slot {
if ($ret eq 'ok') {
$r->print('
'.&mt('You already have a reservation: "[_1]", assigned by your instructor.', + $description1).'
'. + ''.&mt('Your instructor must unassign it before you can make a new reservation.'). + '
'); + } elsif ($slot_name ne $env{'form.slotname'}) { $r->print(<'
+ $r->print(' '
.&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
- .'
'.&mt('Successfully signed up: [_1]',$description).'
'); $retvalue = 1; @@ -1038,14 +1345,25 @@ sub allowed_slot { # not allowed for this resource if (defined($slot->{'symb'})) { my $exclude = 1; - my ($slotmap,$slotid,$sloturl) = &Apache::lonnet::decode_symb($slot->{'symb'}); - if ($sloturl=~/\.(page|sequence)$/) { - my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb); - if (($map ne '') && ($map eq $slotmap)) { + my @symbs; + if ($slot->{'symb'} =~ /,/) { + @symbs = split(/\s*,\s*/,$slot->{'symb'}); + } else { + @symbs = ($slot->{'symb'}); + } + my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb); + foreach my $reqsymb (@symbs) { + next if ($reqsymb eq ''); + my ($slotmap,$slotid,$sloturl) = &Apache::lonnet::decode_symb($reqsymb); + if ($sloturl=~/\.(page|sequence)$/) { + if (($map ne '') && ($map eq $sloturl)) { + $exclude = 0; + last; + } + } elsif ($reqsymb eq $symb) { $exclude = 0; + last; } - } elsif ($slot->{'symb'} eq $symb) { - $exclude = 0; } if ($exclude) { unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) { @@ -1348,10 +1666,6 @@ sub show_table { } my $available; if ($mgr eq 'F') { - # FIXME: This line should be deleted once Slots uses breadcrumbs - $r->print(''.&mt('No slots meet the criteria for display').'
'); + } + $r->print(''); return; } sub manage_reservations { my ($r,$crstype,$slots,$consumed_uniqueperiods,$allavailable) = @_; + my ($cnum,$cdom)=&get_course(); my $navmap = Apache::lonnavmaps::navmap->new(); $r->print(''
.&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
@@ -1800,252 +2149,233 @@ sub manage_reservations {
'');
return;
}
- my (%parent,%shownparent,%container,%container_title,%contents);
- my ($depth,$count,$reservable,$lastcontainer,$rownum) = (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=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &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=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem is currently available.');
+ } elsif ($slot_status == $resource->RESERVED_LOCATION) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem is available at a different location.');
+ $get_choices = 1;
+ } elsif ($slot_status == $resource->RESERVED_LATER) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &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 = '
'. &mt('Your reservation status for any such assignments is listed below:'). '
'. - ''.$spacers.''. + $icon.(' ' x6).' | '."\n"; + if (ref($output{$currmap}) eq 'HASH') { + my $formnum = $mapnum.'_'.$reservable+1; + my $class = 'LC_slotmaptext_'.$mapnum; + if ($output{$currmap}{'hasaction'}) { + $row .= ''. + $output{$currmap}{'msg'}. + ' | '. + &slot_chooser($repsymbs{$currmap},$class,$formnum, + $allavailable,$slots,$consumed_uniqueperiods). + ' | '; } else { - $allstatuses{$output{$symb}{'slotstatus'}} = [$symb]; + $row .= ''. + $output{$currmap}{'msg'}. + ' | '; } + $row .= ''."\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 .= ' | '. - $output{$repsymb}{'msg'}. - ' | '. - &slot_chooser($repsymb,$class,$formnum,$allavailable,$slots, - $consumed_uniqueperiods). - ' | '; - } else { - $mapitem .= ''. - $output{$repsymb}{'msg'}. - ' | '; - } - } - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - my $bgcolor = $backgrounds[$output{$symb}{'rownum'} % $numcolors]; - $currmapoutput .= $output{$symb}{'header'}. - ' '."\n"; - } - } - } else { - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - my $bgcolor = $backgrounds[$output{$symb}{'rownum'} % $numcolors]; - $currmapoutput .= $output{$symb}{'header'}. - '|
'.$spacers.$icon.(' ' x6).' | '."\n"; } + $r->print($row); } } - if ($mapitem) { - if ($got_map_slot) { - $mapitem =~ s{(print($mapitem.$currmapoutput); - } - 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=''.&mt('Reserved:'). - ' '.$slotdescription.' | |||||||
'.join('',@{$maprows[$i]}).' | '. - '||||||||
'.$maprows[$i][0]. - ''. - $maprows[$i][1].(' ' x6).' | '."\n"; - } - } - } - $output{$symb}{'mapnum'} = $mapnum; - } $rownum ++; - $output{$symb}{'rownum'} = $rownum; if (!$shownheader) { - $output{$symb}{'header'} = $slotheader; + $r->print($slotheader); $shownheader = 1; } - $output{$symb}{'info'} = ''; + my $style; + if (exists($output{$currmap})) { + $style = 'none'; + } else { + $style = 'table-row'; + $shown ++; + } + my $title = $resource->compTitle(); + my $bgcolor = $backgrounds[$shown % $numcolors]; + $r->print(' | |||||||
'); for (my $i=0; $i<$depth; $i++) { - $output{$symb}{'info'} .= ''; + $r->print(''); } - $output{$symb}{'info'} .= ''. - 'src().'?symb='.$symb.'">'. + ''.$title.''.(' ' x6).' | '; - - my $hasaction; - if ($status == $resource->OPEN) { - if ($get_choices) { - $hasaction = 1; - $output{$symb}{'hasaction'} = $hasaction; - } + $r->print('problem.gif" alt="'.&mt('Problem')); } + $r->print('" />'.$title.''.(' ' x6).''); my $class = 'LC_slottext_'.$mapnum; - if ($hasaction) { - $output{$symb}{'data'} = ''.$msg.' | '. - ''. - &slot_chooser($symb,$class,$reservable,$allavailable,$slots, - $consumed_uniqueperiods).' | '; + if ($output{$symb}{'hasaction'}) { + $r->print(''.$output{$symb}{'msg'}.' | '. + ''. + &slot_chooser($symb,$class,$reservable,$allavailable,$slots, + $consumed_uniqueperiods).' | '); } else { - $output{$symb}{'data'} = ''. - ''.$msg.''. - ' | '; + $r->print(''. + ''.$output{$symb}{'msg'}.''. + ' | '); } + $r->print('
'.&mt('Previous [_1] changes',$curr{'show'}).' | '); + $r->print(''); } if ($more_records) { - $r->print(''.&mt('Next [_1] changes',$curr{'show'}).' | '); + $r->print(''); } - $r->print('