'.&mt('Open after').' '.
+ ''.&mt('Open after').' '.
&Apache::lonhtmlcommon::date_setter($chooserform,'start',$starttime,'','','','','','','',1,1).
- ' '.&mt('Closed before').' '.
+ ' '.&mt('Closed before').' '.
&Apache::lonhtmlcommon::date_setter($chooserform,'end',$endtime,'','','','','','','',1,1).
'
'.
' '.
'';
}
if ($env{'form.command'} eq 'manageresv') {
- $output .= '
';
+ $output .= ''.
+ ''.&mt('Action').' '.&mt('Name').' ';
} else {
- $output .= &Apache::loncommon::start_data_table();
+ $output .= &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Action').' '.&mt('Name').' '.
+ &Apache::loncommon::end_data_table_header_row();
}
+ my $shownsymb;
+ if ($env{'request.role.adv'}) {
+ $shownsymb = $symb;
+ } elsif (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i) {
+ $shownsymb = &Apache::lonenc::encrypted($symb);
+ } else {
+ $shownsymb = $symb;
+ }
+ $shownsymb = &escape($shownsymb);
foreach my $slot (@{$available}) {
my $description=&get_description($slot,$slots->{$slot});
my $form;
@@ -1394,7 +1591,6 @@ ENDSCRIPT
}
}
}
- my $escsymb=&escape($symb);
if (!$form) {
my $name;
if ($formname) {
@@ -1407,7 +1603,7 @@ ENDSCRIPT
$form=<
-
+
@@ -1439,8 +1635,11 @@ STUFF
if (@{$available} > 1) {
$output .= '';
}
- $r->print($output);
- return;
+ if ($class) {
+ return ''.$output.'
';
+ } else {
+ return $output;
+ }
}
sub to_show {
@@ -1502,7 +1701,7 @@ sub to_show {
}
return 0;
}
-
+
return 1;
}
@@ -1517,11 +1716,20 @@ sub remove_link {
undef($udom);
}
+ my $shownsymb;
+ if ($env{'request.role.adv'}) {
+ $shownsymb = $symb;
+ } elsif (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i) {
+ $shownsymb = &Apache::lonenc::encrypted($symb);
+ } else {
+ $shownsymb = $symb;
+ }
+
$slotname = &escape($slotname);
$entry = &escape($entry);
$uname = &escape($uname);
$udom = &escape($udom);
- $symb = &escape($symb);
+ $symb = &escape($shownsymb);
return <<"END_LINK";
'array',
'when' => 'scalar',
'order' => 'scalar',
@@ -1591,12 +1799,13 @@ sub show_table {
'secret' => 'Secret Word',
'space' => '# of students/max',
'ip' => 'IP or DNS restrictions',
- 'symb' => 'Resource slot is restricted to.',
+ 'symb' => 'Resource(s)/Map(s) slot is restricted to.',
'allowedsections' => 'Sections slot is restricted to.',
'allowedusers' => 'Users slot is restricted to.',
'uniqueperiod' => 'Period of time slot is unique',
'scheduled' => 'Scheduled Students',
- 'proctor' => 'List of proctors');
+ 'proctor' => 'List of proctors',
+ 'iptied' => 'Unique IP each student',);
if ($crstype eq 'Community') {
$show_fields{'startreserve'} = &mt('Time members can start reserving');
$show_fields{'endreserve'} = &mt('Time members can no longer reserve');
@@ -1604,7 +1813,7 @@ sub show_table {
}
my @show_order=('name','description','type','starttime','endtime',
'startreserve','endreserve','reservationmsg','secret','space',
- 'ip','symb','allowedsections','allowedusers','uniqueperiod',
+ 'ip','iptied','symb','allowedsections','allowedusers','uniqueperiod',
'scheduled','proctor');
my @show =
(exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
@@ -1651,7 +1860,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';
@@ -1664,48 +1873,44 @@ sub show_table {
');
$r->print('');
$r->print('
- '.&mt('Show').'
- '.&mt('Student Display').'
- '.&mt('Open').'
- '.&mt('Slot Name Filter').'
+ '.&mt('Show').'
+ '.&mt('Student Display').'
+ '.&mt('Open').'
+ '.&mt('Slot Name Filter').'
'.&mt('Options').'
- '.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).
+ '.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order,'show').
'
'.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display,
6,\%stu_display_fields,
- \@stu_display_order).'
+ \@stu_display_order,'studisplay').'
- '.&Apache::loncommon::select_form($when,'when',\%when_fields).
+ '.&Apache::loncommon::select_form($when,'when',\%when_fields,'','','when').
'
- '.&Apache::loncommon::select_form($name_filter_type,
+ '.&Apache::loncommon::select_form($name_filter_type,
'name_filter_type',
- \%name_filter_type_fields).
- ' '.
+ \%name_filter_type_fields,'','','name_filter_type').
+ ' '.
&Apache::lonhtmlcommon::textbox('name_filter_value',
$env{'form.name_filter_value'},
- 15).
- '
+ 15,'aria-label="'.&mt('Name filter').'"').
+ '
-
-
- '.&mt('Deleted slots:').'
- '.$show_radio.&mt('Show').'
-
-
- '.$hide_radio.&mt('Hide').'
-
-
-
+
+ '.&mt('Deleted slots').'
+ '.$show_radio.&mt('Show').'
+ '.$hide_radio.&mt('Hide').'
+
+
');
$r->print('
');
$r->print('
');
my $linkstart=' '.&mt('Action').'';
foreach my $which (@show_order) {
if ($which ne 'proctor' && exists($show{$which})) {
$tableheader .= ' '.$linkstart.$which.'">'.$show_fields{$which}.' ';
@@ -1731,7 +1936,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]
@@ -1765,7 +1970,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));
@@ -1807,13 +2012,21 @@ sub show_table {
localtime($slots{$slot}{'uniqueperiod'}[1]);
}
- my $title;
+ my @titles;
if (exists($slots{$slot}{'symb'})) {
- my (undef,undef,$res)=
- &Apache::lonnet::decode_symb($slots{$slot}{'symb'});
- $res = &Apache::lonnet::clutter($res);
- $title = &Apache::lonnet::gettitle($slots{$slot}{'symb'});
- $title=''.$title.' ';
+ my @symbs;
+ if ($slots{$slot}{'symb'} =~ /,/) {
+ @symbs = split(/\s*,\s*/,$slots{$slot}{'symb'});
+ } else {
+ @symbs = ($slots{$slot}{'symb'});
+ }
+ foreach my $reqsymb (@symbs) {
+ my (undef,undef,$res) =
+ &Apache::lonnet::decode_symb($reqsymb);
+ $res = &Apache::lonnet::clutter($res);
+ my $title = &Apache::lonnet::gettitle($reqsymb);
+ push(@titles,''.$title.' ');
+ }
}
my $allowedsections;
@@ -1864,11 +2077,11 @@ sub show_table {
my ($edit,$delete,$showlog,$remove_all);
if ($mgr) {
$edit=(<<"EDITLINK");
-$lt{'edit'}
+$lt{'edit'}
EDITLINK
$delete=(<<"DELETELINK");
-$lt{'delete'}
+$lt{'delete'}
DELETELINK
$remove_all=&remove_link($slot,'remove all').' ';
@@ -1881,7 +2094,7 @@ DELETELINK
}
$showlog=(<<"LOGLINK");
-$lt{'slotlog'}
+$lt{'slotlog'}
LOGLINK
if ($slots{$slot}{'type'} ne 'schedulable_student') {
@@ -1938,8 +2151,18 @@ LOGLINK
if (exists($show{'ip'})) {
$colspan++;$r->print("$slots{$slot}{'ip'} \n");
}
+ if (exists($show{'iptied'})) {
+ $colspan++;
+ if ($slots{$slot}{'iptied'} eq 'yes') {
+ $r->print(''.&mt('Yes')." \n");
+ } elsif ($slots{$slot}{'iptied'} eq 'answer') {
+ $r->print(''.&mt('Yes, including post-answer date')." \n");
+ } else {
+ $r->print(''.&mt('No')." \n");
+ }
+ }
if (exists($show{'symb'})) {
- $colspan++;$r->print("$title \n");
+ $colspan++;$r->print("".join(' ',@titles)." \n");
}
if (exists($show{'allowedsections'})) {
$colspan++;$r->print("$allowedsections \n");
@@ -1973,6 +2196,7 @@ STUFF
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.')
@@ -2004,179 +2228,244 @@ 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:').
'
'.
- ''."\n";
+ ''."\n".
+ ''.
+ ''.&mt('Resource or Folder').' '.
+ ''.&mt('Reservation Status').' '."\n";
my $shownheader = 0;
+ my $currmap;
my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
while (my $resource = $it->next()) {
if ($resource == $it->BEGIN_MAP()) {
$depth++;
- $parent{$depth} = $lastcontainer;
- }
- if ($resource == $it->END_MAP()) {
- $depth--;
- $lastcontainer = $parent{$depth};
- }
- if (ref($resource)) {
- my $symb = $resource->symb();
- my $ressymb = $symb;
- $contents{$lastcontainer} ++;
- next if (!$resource->is_problem() && !$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));
- 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');
- 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');
+ $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;
}
- }
- $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;
+ my $bgcolor = $backgrounds[$shown % $numcolors];
+ my ($spacers,$icon);
+ my $row = '';
+ 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';
}
- $treelevel --;
- $higherup = $parent{$treelevel};
- }
- foreach my $item (@maprows) {
- $rownum ++;
- my $bgcolor = $backgrounds[$rownum % $numcolors];
- if (!$shownheader) {
- $r->print($slotheader);
- $shownheader = 1;
+ $row .= ''.$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 {
+ $row .= ''.
+ $output{$currmap}{'msg'}.
+ ' ';
+ }
+ $row .= ' '."\n";
+ } else {
+ $row .= ' '."\n";
}
- $r->print(''.$item.' '."\n");
+ } else {
+ my ($spacers,$icon) = &show_map_row($depth,$location,$currmaptype,$currmaptitle);
+ $row .= ''.$spacers.$icon.(' ' x6).' '."\n";
}
+ $r->print($row);
}
+ }
+ } elsif ($resource == $it->END_MAP()) {
+ $depth--;
+ $currcontainer = $parent{$depth};
+ } elsif (ref($resource)) {
+ my $symb = $resource->symb();
+ my $src = $resource->src();
+ my ($shownsymb,$shownsrc);
+ $shownsymb = $resource->shown_symb();
+ if ($resource->encrypted()) {
+ $shownsrc = &Apache::lonenc::encrypted($src);
+ } else {
+ $shownsrc = $src;
+ }
+ next if (!$resource->is_problem() && !$resource->is_tool() &&
+ !$resource->is_sequence() && !$resource->is_page());
+ $count ++;
+ if (($resource->is_sequence()) || ($resource->is_page())) {
+ $currcontainer = $count;
+ $container{$currcontainer} = $resource;
+ $container_title{$currcontainer} = $resource->compTitle();
+ }
+ if ($resource->is_problem() || $resource->is_tool()) {
+ next unless (exists($output{$symb}));
+ $reservable ++;
$rownum ++;
- my $bgcolor = $backgrounds[$rownum % $numcolors];
if (!$shownheader) {
$r->print($slotheader);
$shownheader = 1;
}
- $r->print(''."\n");
+ 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++) {
$r->print(' ');
}
- my $result = ''.
- ' '.
+ ''.$title.' '.(' ' x6).' ';
- my $hasaction;
- if ($status == $resource->OPEN) {
- if ($get_choices) {
- $hasaction = 1;
- }
- }
- if ($hasaction) {
- $result .= ''.$msg.' '.
- '';
+ $r->print('" />'.$title.' '.(' ' x6).' ');
+ my $class = 'LC_slottext_'.$mapnum;
+ if ($output{$symb}{'hasaction'}) {
+ $r->print(''.$output{$symb}{'msg'}.' '.
+ ''.
+ &slot_chooser($symb,$class,$reservable,$allavailable,$slots,
+ $consumed_uniqueperiods).' ');
} else {
- $result .= ''.$msg.' ';
+ $r->print(''.
+ ''.$output{$symb}{'msg'}.' '.
+ ' ');
}
- $r->print($result);
- if ($hasaction) {
- my @got_slots=&check_for_reservation($symb,'allslots');
- if ($got_slots[0] =~ /^error: /) {
- $r->print(''.
- &mt('An error occurred determining slot availability.').
- ' ');
- } else {
- my $formname = 'manageres_'.$reservable;
- if (ref($allavailable) eq 'ARRAY') {
- my @available;
- if (ref($slots) eq 'HASH') {
- foreach my $slot (@{$allavailable}) {
- # not allowed for this resource
- if (ref($slots->{$slot}) eq 'HASH') {
- if ((defined($slots->{$slot}->{'symb'})) &&
- ($slots->{$slot}->{'symb'} ne $symb)) {
- next;
- }
- }
- push(@available,$slot);
- }
- }
- &show_choices($r,$symb,$formname,$reservable,$slots,$consumed_uniqueperiods,
- \@available,\@got_slots);
- }
- }
- $r->print('');
- }
- $r->print(' ');
+ $r->print(''."\n");
}
}
}
@@ -2197,19 +2486,68 @@ sub manage_reservations {
}
sub show_map_row {
- my ($depth,$location,$type,$title,$maprows) = @_;
- my $output = '';
+ my ($depth,$location,$type,$title) = @_;
+ my $spacers;
for (my $i=0; $i<$depth-1; $i++) {
- $output .= ' ';
+ $spacers .= ' ';
}
+ my $icon;
if ($type eq 'page') {
- $output .= ' '."\n";
+ $icon = ' '."\n";
} else {
- $output .= ' '."\n";
+ $icon = ' '."\n";
}
- $output .= $title.' '."\n";
- unshift (@{$maprows},$output);
- return;
+ $icon .= $title;
+ return ($spacers,$icon);
+}
+
+sub slot_chooser {
+ my ($symb,$class,$formnum,$allavailable,$slots,$consumed_uniqueperiods) = @_;
+ my $output;
+ my @got_slots=&check_for_reservation($symb,'allslots');
+ if ($got_slots[0] =~ /^error: /) {
+ $output = ''.
+ &mt('An error occurred determining slot availability.').
+ ' ';
+ } else {
+ my $formname = 'manageres_'.$formnum;
+ if (ref($allavailable) eq 'ARRAY') {
+ my @available;
+ if (ref($slots) eq 'HASH') {
+ foreach my $slot (@{$allavailable}) {
+ # not allowed for this resource
+ if (ref($slots->{$slot}) eq 'HASH') {
+ if ($slots->{$slot}->{'symb'} ne '') {
+ my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
+ my $exclude = 1;
+ my @reqsymbs = split(/\s*,\s*/,$slots->{$slot}->{'symb'});
+ if (@reqsymbs) {
+ if (grep(/^\Q$symb\E$/,@reqsymbs)) {
+ $exclude = 0;
+ } else {
+ foreach my $reqsymb (@reqsymbs) {
+ my (undef,undef,$sloturl) = &Apache::lonnet::decode_symb($reqsymb);
+ if ($sloturl=~/\.(page|sequence)$/) {
+ if (($map ne '') && ($map eq $sloturl)) {
+ $exclude = 0;
+ last;
+ }
+ }
+ }
+ }
+ next if ($exclude);
+ }
+ }
+ }
+ push(@available,$slot);
+ }
+ }
+ $output .= &show_choices($symb,$formname,$formnum,$class,
+ $slots,$consumed_uniqueperiods,
+ \@available,\@got_slots);
+ }
+ }
+ return $output;
}
sub show_reservations {
@@ -2221,8 +2559,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') {
@@ -2397,8 +2734,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); }
@@ -2625,11 +2961,19 @@ sub display_filter {
my ($formname,$cdom,$cnum,$curr,$version,$allsymbs) = @_;
my $nolink = 1;
my (%titles,%maptitles);
- my $output = ''.
- ''.&mt('Changes/page:').' '.
- &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
- (&mt('all'),5,10,20,50,100,1000,10000)).
- ' ';
+ my $output = ''.
+ ''.&mt('Changes/page:').' '.
+ ''.&mt('Window during which changes occurred:').' ';
+ if (ref($allsymbs) eq 'ARRAY') {
+ $output.= ''.&mt('Resource').' '.
+ ''.&mt('Context').' ';
+ } else {
+ $output.= ''.&mt('Action').' ';
+ }
+ $output .= ''.
+ &Apache::lonmeta::selectbox('show',$curr->{'show'},'','show',undef,
+ (&mt('all'),5,10,20,50,100,1000,10000)).
+ ' ';
my $startform =
&Apache::lonhtmlcommon::date_setter($formname,'log_start_date',
$curr->{'log_start_date'},undef,
@@ -2640,13 +2984,13 @@ sub display_filter {
undef,undef,undef,undef,undef,undef,$nolink);
my $crstype = &Apache::loncommon::course_type();
my %lt = &reservationlog_contexts($crstype);
- $output .= ''.&mt('Window during which changes occurred:').
- ' '.&mt('After:').
- ' '.$startform.' '.&mt('Before:').' '.
- $endform.'
';
+ $output .= ''.&mt('After:').' '.
+ ''.$startform.' '.
+ ''.&mt('Before:').' '.
+ ''.$endform.'
'.
+ ' ';
if (ref($allsymbs) eq 'ARRAY') {
- $output .= ''.&mt('Resource').' '.
- '{'resource'} eq 'any') {
$output .= ' selected="selected"';
}
@@ -2659,8 +3003,8 @@ sub display_filter {
}
$output .= ' '.$title.' ';
}
- $output .= ' '.
- &mt('Context:').' ';
+ $output .= ' '.
+ '';
foreach my $chgtype ('any','user','manage','parameter') {
my $selstr = '';
if ($curr->{'chgcontext'} eq $chgtype) {
@@ -2670,8 +3014,7 @@ sub display_filter {
}
$output .= ' ';
} else {
- $output .= ''.&mt('Action').' '.
- '{'action'} eq 'any') {
$output .= ' selected="selected"';
}
@@ -2685,7 +3028,7 @@ sub display_filter {
}
$output .= ' ';
}
- $output .= '
'.
+ $output .= '
'.
'
'.
''.
@@ -2735,15 +3078,15 @@ sub slot_change_messaging {
}
sub upload_start {
- my ($r)=@_;
+ my ($r)=@_;
$r->print(
&Apache::grades::checkforfile_js()
- .'
'.&mt('Upload a file containing the slot definitions').' '
+ .''.&mt('Upload a file containing the slot definitions').' '
.'