--- loncom/interface/lonnavmaps.pm 2011/11/29 01:49:00 1.469 +++ loncom/interface/lonnavmaps.pm 2011/12/25 20:41:53 1.477 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.469 2011/11/29 01:49:00 www Exp $ +# $Id: lonnavmaps.pm,v 1.477 2011/12/25 20:41:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -225,7 +225,7 @@ automatically. =over 4 -=item * B: default: constructs one from %env +=item * BRESERVABLE) { - return &mt('Reservable ending [_1]', + return &mt('Reservable, reservations close [_1]', timeToHumanString($slot_time,'end')); } elsif ($slot_status == $res->RESERVABLE_LATER) { - return &mt('Reservable starting [_1]', + return &mt('Reservable, reservations open [_1]', timeToHumanString($slot_time,'start')); } elsif ($slot_status == $res->NOT_IN_A_SLOT) { return &mt('Reserve a time/place to work'); @@ -899,6 +896,7 @@ sub part_status_summary { return 4; } sub render_resource { my ($resource, $part, $params) = @_; + my $editmapLink; my $nonLinkedText = ''; # stuff after resource title not in link my $link = $params->{"resourceLink"}; @@ -980,6 +978,14 @@ sub render_resource { $linkopen = ""; $linkclose = ""; } + if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && + ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/)) { + my $icon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png'; + $editmapLink=' '. + ''. + ''.&mt('Edit Content').''. + ''; + } } if ($resource->randomout()) { @@ -1013,8 +1019,10 @@ sub render_resource { # Is this the current resource? if (!$params->{'displayedHereMarker'} && $resource->symb() eq $params->{'here'} ) { - $curMarkerBegin = ''; - $curMarkerEnd = ''; + unless ($resource->is_map()) { + $curMarkerBegin = ''; + $curMarkerEnd = ''; + } $params->{'displayedHereMarker'} = 1; } @@ -1033,7 +1041,7 @@ sub render_resource { if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) { $result .= "$curMarkerBegin$title$partLabel$curMarkerEnd$nonLinkedText"; } else { - $result .= "$curMarkerBegin$linkopen$title$partLabel$curMarkerEnd$nonLinkedText"; + $result .= "$curMarkerBegin$linkopen$title$partLabel$curMarkerEnd$editmapLink$nonLinkedText"; } return $result; @@ -1047,6 +1055,7 @@ sub render_communication_status { my $linkopen = ""; my $linkclose = ""; my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc"); + if ($resource->hasDiscussion()) { $discussionHTML = $linkopen . ''.&mt('New Discussion').'' . @@ -1135,14 +1144,6 @@ sub render_long_status { $result .= getDescription($resource, $part); if ($color) {$result .= ""; } } - if ($resource->is_map()) { - if (&Apache::lonnet::allowed('mdc')) { - if ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/) { - $result.=" ". - "".&mt("Edit Content").' '; - } - } - } if ($resource->is_map() && &advancedUser() && $resource->randompick()) { $result .= &mt('(randomly select [_1])', $resource->randompick()); } @@ -1397,6 +1398,7 @@ sub render { } } + # (re-)Locate the jump point, if any # Note this does not take filtering or hidden into account... need # to be fixed? @@ -1505,19 +1507,20 @@ END } } $result.=''; + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + &add_linkitem($args->{'linkitems'},'edittoplevel', + "javascript:gocmd('/adm/coursedocs','editdocs');", + 'Content Editor'); + } + } } if ($args->{'caller'} eq 'navmapsdisplay') { - $result .= ''; - $result .= ''; - $result.=''; - $result.=&show_linkitems_toolbar($args->{'linkitems'}); - if ($args->{'sort_html'}) { - $result.=''. - ''; - } - $result .= '
'. - &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').' '.&mt('Tools:').'   '.$args->{'sort_html'}.'
'; + $result .= &show_linkitems_toolbar($args,$condition); } elsif ($args->{'sort_html'}) { $result.=$args->{'sort_html'}; } @@ -1649,6 +1652,7 @@ END $curRes = shift(@resources); } else { $curRes = $it->next($closeAllPages); + } if (!$curRes) { last; } @@ -1854,41 +1858,55 @@ sub add_linkitem { } sub show_linkitems_toolbar { - my ($linkitems,$condition)=@_; - my @linkorder = ('firsthomework','everything','uncompleted', - 'changefolder','clearbubbles'); - my $result .=''."\n". - ''."\n". - '
    '; - foreach my $link (@linkorder) { - my $link_id = 'LC_content_toolbar_'.$link; - if (defined($linkitems->{$link})) { - if ($linkitems->{$link}{'text'} ne '') { - $linkitems->{$link}{'cmd'}=~s/"/'/g; - if ($linkitems->{$link}{'cmd'}) { - if ($link eq 'changefolder') { - if ($condition) { - $link_id='LC_content_toolbar_changefolder_toggled'; - } else { - $link_id='LC_content_toolbar_changefolder'; + my ($args,$condition) = @_; + my $result = + ''. + ''. + ''; + if (ref($args) eq 'HASH') { + if (ref($args->{'linkitems'}) eq 'HASH') { + my @linkorder = ('firsthomework','everything','uncompleted', + 'changefolder','clearbubbles','edittoplevel'); + $result .=''."\n"; + } + if ($args->{'sort_html'}) { + $result .= ''. + ''; } } - $result .= ''. - ''."\n"; + $result .= '
    '. + &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT'). + ' '.&mt('Tools:').''."\n". + ''."\n". + '
      '; + foreach my $link (@linkorder) { + my $link_id = 'LC_content_toolbar_'.$link; + if (ref($args->{'linkitems'}{$link}) eq 'HASH') { + if ($args->{'linkitems'}{$link}{'text'} ne '') { + $args->{'linkitems'}{$link}{'cmd'}=~s/"/'/g; + if ($args->{'linkitems'}{$link}{'cmd'}) { + if ($link eq 'changefolder') { + if ($condition) { + $link_id='LC_content_toolbar_changefolder_toggled'; + } else { + $link_id='LC_content_toolbar_changefolder'; + } + } + $result .= '
    • '. + '
    • '."\n"; } } - $result .= '
    • '. - '
    • '."\n"; } } + $result .= '
    '. + '
       '.$args->{'sort_html'}.'
    '; return $result; } - 1; @@ -1995,7 +2013,7 @@ sub new { # assume there are course hashes for the specific requested user@domamin: # - if (($self->{USERNAME} eq $env{'user.name'}) && ($self->{DOMAIN} eq $env{'user.domain'})) { + if ( ($self->{USERNAME} eq $env{'user.name'}) && ($self->{DOMAIN} eq $env{'user.domain'})) { # tie the nav hash @@ -2020,7 +2038,9 @@ sub new { } else { $self->change_user($self->{USERNAME}, $self->{DOMAIN}); } - + + my $d = Data::Dumper->new([$self]); + return $self; } @@ -2055,6 +2075,8 @@ sub change_user { &Apache::lonmap::loadmap($cnum, $cdom, $self->{USERNAME}, $self->{DOMAIN}, \%big_hash); $self->{NAV_HASH} = \%big_hash; + + # Now clear the parm cache and reconstruct the parm hash fromt he big_hash # param.xxxx keys. @@ -2070,6 +2092,7 @@ sub change_user { } $self->{PARM_HASH} = \%parm_hash; + @@ -3062,12 +3085,15 @@ sub new { if ($resourceCount == 1 && $resource->is_sequence() && !$self->{FORCE_TOP}) { my $firstResource = $resource->map_start(); my $finishResource = $resource->map_finish(); - return - Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, - $finishResource, $self->{FILTER}, - $self->{ALREADY_SEEN}, - $self->{CONDITION}, - $self->{FORCE_TOP}); + my $result; + my $rdump = Data::Dumper->new([$result]); + $result = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, + $finishResource, $self->{FILTER}, + $self->{ALREADY_SEEN}, + $self->{CONDITION}, + $self->{FORCE_TOP}); + return $result; + } @@ -3087,6 +3113,7 @@ sub new { $self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1; bless ($self); + my $selfDump = Data::Dumper->new([$self]); return $self; } @@ -3102,6 +3129,8 @@ sub next { # do so. if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0}) { $self->{HAVE_RETURNED_0} = 1; + my $nextTopLevel = $self->{NAV_MAP}->getById('0.0'); + return $self->{NAV_MAP}->getById('0.0'); } if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0_BEGIN_MAP}) { @@ -3121,13 +3150,13 @@ sub next { if ($self->{RECURSIVE_DEPTH} == 0) { $self->{RECURSIVE_ITERATOR_FLAG} = 0; } - return $next; } if (defined($self->{FORCE_NEXT})) { my $tmp = $self->{FORCE_NEXT}; $self->{FORCE_NEXT} = undef; + return $tmp; } @@ -3197,6 +3226,8 @@ sub next { # So we need to look at all the resources we can get to from here, # categorize them if we haven't seen them, remember if we have a new my $nextUnfiltered = $here->getNext(); + + my $maxDepthAdded = -1; for (@$nextUnfiltered) { @@ -3230,7 +3261,6 @@ sub next { $self->{RECURSIVE_ITERATOR_FLAG} = 1; my $firstResource = $self->{HERE}->map_start(); my $finishResource = $self->{HERE}->map_finish(); - $self->{RECURSIVE_ITERATOR} = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, $finishResource, $self->{FILTER}, @@ -3248,6 +3278,8 @@ sub next { return $self->next($closeAllPages); } + my $hereResource = $self->{HERE}; + return $self->{HERE}; } @@ -3414,6 +3446,7 @@ sub next { my $nextUnfiltered; if ($self->{DIRECTION} == FORWARD()) { $nextUnfiltered = $self->{HERE}->getNext(); + } else { $nextUnfiltered = $self->{HERE}->getPrevious(); } @@ -5073,12 +5106,13 @@ sub status { } # Otherwise, it's untried and open - return OPEN; + return OPEN; } sub check_for_slot { my $self = shift; my $part = shift; + my $symb = $self->symb(); my ($use_slots,$available,$availablestudent) = $self->slot_control($part); if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) { my @slots = (split(/:/,$availablestudent),split(/:/,$available)); @@ -5086,50 +5120,45 @@ sub check_for_slot { my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; my $now = time; + my $num_usable_slots = 0; if (@slots > 0) { my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); if (&Apache::lonnet::error(%slots)) { return (UNKNOWN); } - my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots); + my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); my ($checkedin,$checkedinslot); foreach my $slot_name (@sorted_slots) { - next if (!defined($slots{$slot_name}) || - !ref($slots{$slot_name})); + next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); my $end = $slots{$slot_name}->{'endtime'}; my $start = $slots{$slot_name}->{'starttime'}; my $ip = $slots{$slot_name}->{'ip'}; if ($self->simpleStatus() == OPEN) { - my $startreserve = $slots{$slot_name}->{'startreserve'}; - my @proctors; - if ($slots{$slot_name}->{'proctor'} ne '') { - @proctors = split(',',$slots{$slot_name}->{'proctor'}); - } if ($end > $now) { - ($checkedin,$checkedinslot) = $self->checkedin(); - if ($startreserve < $now) { - if ($start > $now) { - return (RESERVED_LATER,$start,$slot_name); - } else { - if ($ip ne '') { - if (!&Apache::loncommon::check_ip_acc($ip)) { - return (RESERVED_LOCATION,$ip,$slot_name); - } - } - if (@proctors > 0) { - unless ((grep(/^\Q$checkedin\E/,@proctors)) && - ($checkedinslot eq $slot_name)) { - return (NEEDS_CHECKIN,undef,$slot_name); - } + if ($start > $now) { + return (RESERVED_LATER,$start,$slot_name); + } else { + if ($ip ne '') { + if (!&Apache::loncommon::check_ip_acc($ip)) { + return (RESERVED_LOCATION,$ip,$slot_name); } - return (RESERVED,$end,$slot_name); } - } else { - if ($start > $now) { - return (RESERVABLE,$startreserve,$slot_name); + my @proctors; + if ($slots{$slot_name}->{'proctor'} ne '') { + @proctors = split(',',$slots{$slot_name}->{'proctor'}); } + if (@proctors > 0) { + ($checkedin,$checkedinslot) = $self->checkedin(); + unless ((grep(/^\Q$checkedin\E/,@proctors)) && + ($checkedinslot eq $slot_name)) { + return (NEEDS_CHECKIN,undef,$slot_name); + } + } + return (RESERVED,$end,$slot_name); } } + } elsif ($end > $now) { + $num_usable_slots ++; } } my ($is_correct,$got_grade); @@ -5150,32 +5179,33 @@ sub check_for_slot { return (CORRECT); } } - return(NOT_IN_A_SLOT); - } else { - if (!$future_slots_checked) { - $future_slots = &get_future_slots($cdom,$cnum,$now); - $future_slots_checked = 1; - } - if ($future_slots) { + if ($num_usable_slots) { return(NOT_IN_A_SLOT); } - return(NOTRESERVABLE); } - } - return; -} - -sub get_future_slots { - my ($cdom,$cnum,$now) = @_; - my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum); - my $future_slots = 0; - foreach my $slot (keys(%slots)) { - if (($slots{$slot}->{'starttime'} > $now) && - ($slots{$slot}->{'endtime'} > $now)) { - $future_slots ++; + my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'}, + $env{'user.domain'}); + if (ref($reservable) eq 'HASH') { + if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) { + foreach my $slot (reverse (@{$reservable->{'now_order'}})) { + if (($reservable->{'now'}{$slot}{'symb'} eq '') || + ($reservable->{'now'}{$slot}{'symb'} eq $symb)) { + return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'}); + } + } + } + if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) { + foreach my $slot (@{$reservable->{'future_order'}}) { + if (($reservable->{'future'}{$slot}{'symb'} eq '') || + ($reservable->{'future'}{$slot}{'symb'} eq $symb)) { + return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'}); + } + } + } } + return(NOTRESERVABLE); } - return $future_slots; + return; } sub CLOSED { return 23; }