--- loncom/interface/lonnavmaps.pm 2003/03/08 20:12:32 1.153 +++ loncom/interface/lonnavmaps.pm 2003/03/13 19:57:10 1.158 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.153 2003/03/08 20:12:32 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.158 2003/03/13 19:57:10 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -158,6 +158,7 @@ sub real_handler { $r->print("Navigate Course Contents"); # ------------------------------------------------------------ Get query string &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register']); + # ----------------------------------------------------- Force menu registration my $addentries=''; if ($ENV{'form.register'}) { @@ -177,7 +178,6 @@ sub real_handler { # Now that we've displayed some stuff to the user, init the navmap $navmap->init(); - $r->print('
 '); $r->rflush(); @@ -188,6 +188,32 @@ sub real_handler { return OK; } + # See if there's only one map in the top-level... if so, + # automatically display it + my $iterator = $navmap->getIterator(undef, undef, undef, 0); + my $depth = 1; + $iterator->next(); + my $curRes = $iterator->next(); + my $sequenceCount = 0; + my $sequenceId; + while ($depth > 0) { + if ($curRes == $iterator->BEGIN_MAP()) { $depth++; } + if ($curRes == $iterator->END_MAP()) { $depth--; } + + if (ref($curRes) && $curRes->is_sequence()) { + $sequenceCount++; + $sequenceId = $curRes->map_pc(); + } + + $curRes = $iterator->next(); + } + + if ($sequenceCount == 1) { + # The automatic iterator creation in the render call + # will pick this up. + $ENV{'form.filter'} = "$sequenceId"; + } + # renderer call my $render = render({ 'cols' => [0,1,2,3], 'url' => '/adm/navmaps', @@ -335,6 +361,12 @@ sub lastTry { } # This puts a human-readable name on the ENV variable. +# FIXME: This needs better logic: Who gets the advanced view of navmaps? +# As of 3-13-03, it's an open question. Guy doesn't want to check +# roles directly because it should be a check of capabilities for future +# role compatibity. There is no capability that matches this one for +# now, so this is done. (A hack for 1.0 might be to simply check roles +# anyhow.) sub advancedUser { return $ENV{'user.adv'}; } @@ -520,9 +552,7 @@ Most of these parameters are only useful =item * B: A string identifying the URL to place the anchor 'curloc' at. Default to no anchor at all. It is the responsibility of the renderer user to ensure that the #curloc is in the URL. By default, determined through the use of the ENV{} 'jump' and 'jumpType' information. -=item * B: A URL identifying where to place the 'here' marker. By default, will pull this from the ENV{'form.here*'} info. - -=item * B: A Symb identifying where to place the 'here' marker. Default same as hereURL. +=item * B: A Symb identifying where to place the 'here' marker. Default empty, which means no marker. =item * B: A string identifying the indentation string to use. By default, this is a 25 pixel whitespace image with no alt text. @@ -594,7 +624,7 @@ sub render_resource { my $icon = ""; if ($resource->is_problem()) { - if ($part eq "0" || $params->{'condensed'}) { + if ($part eq "" || $params->{'condensed'}) { $icon = ''; } else { $icon = $params->{'indentString'}; @@ -657,16 +687,14 @@ sub render_resource { my $curMarkerEnd = ''; # Is this the current resource? - if (!$params->{'displayedHereMarker'} && - (($params->{'hereType'} == SYMB() && - $resource->symb() eq $params->{'here'}) || - ($params->{'hereType'} == URL() && - $resource->src() eq $params->{'here'}))) { + if (!$params->{'displayedHereMarker'} && + $resource->symb() eq $params->{'here'} ) { $curMarkerBegin = '> '; $curMarkerEnd = '<'; + $params->{'displayedHereMarker'} = 1; } - if ($resource->is_problem() && $part ne "0" && + if ($resource->is_problem() && $part ne "" && !$params->{'condensed'}) { $partLabel = " (Part $part)"; $title = ""; @@ -809,14 +837,12 @@ sub render { $navmap = $args->{'navmap'}; } + my $r = $args->{'r'}; my $queryString = $args->{'queryString'}; my $jumpToURL = $args->{'jumpToURL'}; my $jumpToSymb = $args->{'jumpToSymb'}; my $jumpType; - my $hereURL = $args->{'hereURL'}; - my $hereSymb = $args->{'hereSymb'}; - my $hereType; - my $here; + my $here = $args->{'here'}; my $jump; my $currentJumpIndex = setDefault($args->{'currentJumpIndex'}, 0); my $suppressNavmap = setDefault($args->{'suppressNavmap'}, 0); @@ -858,20 +884,16 @@ sub render { # Preference: Symb if ($ENV{'form.symb'}) { - $hereType = $jumpType = SYMB(); $here = $jump = $ENV{'form.symb'}; } elsif ($ENV{'form.postdata'}) { # couldn't find a symb, is there a URL? my $currenturl = $ENV{'form.postdata'}; - $currenturl=~s/^http\:\/\///; - $currenturl=~s/^[^\/]+//; + #$currenturl=~s/^http\:\/\///; + #$currenturl=~s/^[^\/]+//; - $hereType = $jumpType = URL; - $here = $jump = $currenturl; - } else { - # Nothing - $hereType = $jumpType = NOTHING(); + $here = $jump = &Apache::lonnet::symbread($currenturl); } + # Step three: Ensure the folders are open my $mapIterator = $navmap->getIterator(undef, undef, undef, 1); my $depth = 1; @@ -887,9 +909,7 @@ sub render { if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; } if ($curRes == $mapIterator->END_MAP()) { $depth--; } - if (ref($curRes) && - ($hereType == SYMB() && $curRes->symb() eq $here) || - (ref($curRes) && $hereType == URL() && $curRes->src() eq $here)) { + if (ref($curRes) && $curRes->symb() eq $here) { my $mapStack = $mapIterator->getStack(); # Ensure the parent maps are open @@ -936,9 +956,7 @@ sub render { if ( !defined($args->{'iterator'}) && $ENV{'form.folderManip'} ) { # we came from a user's manipulation of the nav page # If this is a click on a folder or something, we want to preserve the "here" # from the querystring, and get the new "jump" marker - $hereType = $ENV{'form.hereType'}; $here = $ENV{'form.here'}; - $jumpType = $ENV{'form.jumpType'} || NOTHING(); $jump = $ENV{'form.jump'}; } @@ -974,7 +992,6 @@ sub render { # keeps track of when the current resource is found, # so we can back up a few and put the anchor above the # current resource - my $r = $args->{'r'}; my $printKey = $args->{'printKey'}; my $printCloseAll = $args->{'printCloseAll'}; if (!defined($printCloseAll)) { $printCloseAll = 1; } @@ -1006,11 +1023,11 @@ sub render { if ($printCloseAll) { if ($condition) { $result.="Close All Folders"; } else { $result.="Open All Folders"; } $result .= "

\n"; @@ -1051,7 +1068,6 @@ sub render { # export "here" marker information $args->{'here'} = $here; - $args->{'hereType'} = $hereType; while ($depth > 0) { if ($curRes == $it->BEGIN_MAP()) { $depth++; } @@ -1073,7 +1089,6 @@ sub render { # If this isn't an actual resource, continue on if (!ref($curRes)) { - $curRes = $it->next(); next; } @@ -1081,14 +1096,12 @@ sub render { # If this has been filtered out, continue on if (!(&$filterFunc($curRes))) { - $curRes = $it->next(); $args->{'isNewBranch'} = 0; # Don't falsely remember this next; } # If we're suppressing navmaps and this is a navmap, continue on if ($suppressNavmap && $curRes->src() =~ /^\/adm\/navmaps/) { - $curRes = $it->next(); next; } @@ -1142,28 +1155,19 @@ sub render { } } + } - } else { - # Not showing parts - @parts = ("0"); # show main part only - } - # If the multipart problem was condensed, "forget" it was multipart if (scalar(@parts) == 1) { $args->{'multipart'} = 0; } - # In the event of a network error, display one part. - # If this is a single part, we can at least show the correct - # status, but if it's multipart, we're lost, since we can't - # retreive the metadata to count the parts - if ($curRes->{RESOURCE_ERROR}) { - @parts = ("0"); - } - # Now, we've decided what parts to show. Loop through them and # show them. - foreach my $part (@parts) { + foreach my $part ('', @parts) { + if ($part eq '0') { + next; + } $rownum ++; my $backgroundColor = $backgroundColors[$rownum % scalar(@backgroundColors)]; @@ -1209,7 +1213,7 @@ sub render { $result = ""; $r->rflush(); } - + } continue { $curRes = $it->next(); }