--- loncom/interface/lonnavmaps.pm 2003/03/04 22:30:10 1.152
+++ 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.152 2003/03/04 22:30:10 matthew Exp $
+# $Id: lonnavmaps.pm,v 1.158 2003/03/13 19:57:10 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,6 +38,8 @@
# YEAR=2002
# 1/1 Gerd Kortemeyer
# Oct-Nov Jeremy Bowers
+# YEAR=2003
+# Jeremy Bowers ... lots of days
package Apache::lonnavmaps;
@@ -156,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'}) {
@@ -175,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();
@@ -186,10 +188,36 @@ 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',
- #'printKey' => 1,
+ 'suppressNavmap' => 1,
'r' => $r});
$navmap->untieHashes();
@@ -333,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'};
}
@@ -518,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.
@@ -536,7 +568,9 @@ Most of these parameters are only useful
=item * B: If true, print the "Close all folders" or "open all folders" links. Default is true.
-=item * B: A function that takes the resource object as its only parameter and returns a true or false value. If true, the resource is displayed. If false, it is simply skipped in the display. By default, all resources are showne.
+=item * B: A function that takes the resource object as its only parameter and returns a true or false value. If true, the resource is displayed. If false, it is simply skipped in the display. By default, all resources are shown.
+
+=item * B: If true, will not display Navigate Content resources. Default to false.
=back
@@ -590,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'};
@@ -653,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 = "";
@@ -805,16 +837,15 @@ 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);
my $currentJumpDelta = 2; # change this to change how many resources are displayed
# before the current resource when using #current
@@ -853,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;
@@ -882,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
@@ -931,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'};
}
@@ -969,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; }
@@ -1001,11 +1023,11 @@ sub render {
if ($printCloseAll) {
if ($condition) {
$result.="Close All Folders";
} else {
$result.="Open All Folders";
}
$result .= "
\n";
@@ -1046,7 +1068,6 @@ sub render {
# export "here" marker information
$args->{'here'} = $here;
- $args->{'hereType'} = $hereType;
while ($depth > 0) {
if ($curRes == $it->BEGIN_MAP()) { $depth++; }
@@ -1068,7 +1089,6 @@ sub render {
# If this isn't an actual resource, continue on
if (!ref($curRes)) {
- $curRes = $it->next();
next;
}
@@ -1076,11 +1096,15 @@ 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/) {
+ next;
+ }
+
# Does it have multiple parts?
$args->{'multipart'} = 0;
$args->{'condensed'} = 0;
@@ -1131,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)];
@@ -1192,13 +1207,13 @@ sub render {
$result .= " \n";
$args->{'isNewBranch'} = 0;
}
-
+
if ($r && $rownum % 20 == 0) {
$r->print($result);
$result = "";
$r->rflush();
}
-
+ } continue {
$curRes = $it->next();
}
@@ -2691,7 +2706,7 @@ sub countParts {
sub extractParts {
my $self = shift;
- return if ($self->{PARTS});
+ return if (defined($self->{PARTS}));
return if ($self->ext);
$self->{PARTS} = [];