--- loncom/interface/lonnavmaps.pm 2002/11/15 17:30:33 1.107
+++ loncom/interface/lonnavmaps.pm 2002/11/18 21:12:39 1.114
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.107 2002/11/15 17:30:33 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.114 2002/11/18 21:12:39 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -83,8 +83,11 @@ sub handler {
return HTTP_NOT_ACCEPTABLE;
}
+ $r->print("
\n");
+ $r->print("Navigate Course Contents");
+
# Header
- $r->print(&Apache::loncommon::bodytag('Navigate Course Map','',
+ $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',
''));
$r->print('');
@@ -113,10 +116,22 @@ sub handler {
$condition = 1;
}
+ my $currenturl = $ENV{'form.postdata'};
+ $currenturl=~s/^http\:\/\///;
+ $currenturl=~s/^[^\/]+//;
+
+ # alreadyHere allows us to only open the maps necessary to view
+ # the current location once, while at the same time remembering
+ # the current location. Without that check, the user would never
+ # be able to close those maps; the user would close it, and the
+ # currenturl scan would re-open it.
+ my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .
+ "&alreadyHere=1";
+
if ($condition) {
- $r->print('Close All Folders');
+ $r->print("Close All Folders");
} else {
- $r->print('Open All Folders');
+ $r->print("Open All Folders");
}
$r->print('
');
@@ -143,10 +158,10 @@ sub handler {
my %colormap =
( $res->NETWORK_FAILURE => '',
$res->CORRECT => '',
- $res->EXCUSED => '#BBBBFF',
+ $res->EXCUSED => '#3333FF',
$res->PAST_DUE_ANSWER_LATER => '',
$res->PAST_DUE_NO_ANSWER => '',
- $res->ANSWER_OPEN => '#CCFFCC',
+ $res->ANSWER_OPEN => '#006600',
$res->OPEN_LATER => '',
$res->TRIES_LEFT => '',
$res->INCORRECT => '',
@@ -192,18 +207,7 @@ sub handler {
# maps in their own folders, in favor of "inlining" them.
my $topResource = $navmap->getById("0.0");
my $inlineTopLevelMaps = $topResource->src() =~ m|^/uploaded/.*default\.sequence$|;
-
- my $currenturl = $ENV{'form.postdata'};
- $currenturl=~s/^http\:\/\///;
- $currenturl=~s/^[^\/]+//;
-
- # alreadyHere allows us to only open the maps necessary to view
- # the current location once, while at the same time remembering
- # the current location. Without that check, the user would never
- # be able to close those maps; the user would close it, and the
- # currenturl scan would re-open it.
- my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .
- "&alreadyHere=1";
+ my $inlinedelta = $inlineTopLevelMaps? -1 : 0;
# Begin the HTML table
# four cols: resource + indent, chat+feedback, icon, text string
@@ -285,7 +289,6 @@ sub handler {
$condition);
$mapIterator->next();
$curRes = $mapIterator->next();
- my $deltadepth = 0;
$depth = 1;
my @backgroundColors = ("#FFFFFF", "#F6F6F6");
@@ -299,15 +302,6 @@ sub handler {
}
while ($depth > 0) {
- # If this is an inlined map, cancel the shift to the right,
- # which has the effect of making the map look inlined
- if ($inlineTopLevelMaps && scalar(@{$mapIterator->getStack()}) == 1 &&
- ref($curRes) && $curRes->is_map()) {
- $deltadepth = -1;
- $curRes = $mapIterator->next();
- next;
- }
-
if ($curRes == $mapIterator->BEGIN_MAP() ||
$curRes == $mapIterator->BEGIN_BRANCH()) {
$indentLevel++;
@@ -324,9 +318,6 @@ sub handler {
if (ref($curRes)) { $counter++; }
- if ($depth == 1) { $deltadepth = 0; } # we're done shifting, because we're
- # out of the inlined map
-
# Is this resource being ignored because it is in a random-out
# map and it was not selected?
if (ref($curRes) && !advancedUser() && $curRes->randomout()) {
@@ -336,6 +327,16 @@ sub handler {
if (ref($curRes) && $curRes->src()) {
+ my $deltalevel = $isNewBranch? 1 : 0; # reserves space for branch icon
+
+ if ($indentLevel - $deltalevel + $inlinedelta < 0) {
+ # If this would be at a negative depth (top-level maps in
+ # new-style courses, we want to suppress their title display)
+ # then ignore it.
+ $curRes = $mapIterator->next();
+ next;
+ }
+
# Step one: Decide which parts to show
my @parts = @{$curRes->parts()};
my $multipart = scalar(@parts) > 1;
@@ -421,7 +422,6 @@ sub handler {
# For each part we intend to display...
foreach my $part (@parts) {
- my $deltalevel = 0; # for inserting the branch icon
my $nonLinkedText = ""; # unlinked stuff after title
my $stack = $mapIterator->getStack();
@@ -443,7 +443,6 @@ sub handler {
if ($isNewBranch) {
$newBranchText = "
";
$isNewBranch = 0;
- $deltalevel = 1; # reserves space for the branch icon
}
# links to open and close the folders
@@ -521,12 +520,11 @@ sub handler {
}
# print indentation
- for (my $i = 0; $i < $indentLevel - $deltalevel + $deltadepth; $i++) {
+ for (my $i = 0; $i < $indentLevel - $deltalevel + $inlinedelta; $i++) {
$r->print($indentString);
}
$r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n");
- #$r->print($curRes->awarded($part));
my $curMarkerBegin = "";
my $curMarkerEnd = "";
@@ -553,6 +551,8 @@ sub handler {
'Host down'));
}
+ $r->print("\n");
+
# SECOND COL: Is there text, feedback, errors??
my $discussionHTML = ""; my $feedbackHTML = "";
@@ -611,6 +611,9 @@ sub handler {
}
$r->print(" \n");
+
+ if (!($counter % 20)) { $r->rflush(); }
+ if ($counter == 2) { $r->rflush(); }
}
}
$curRes = $mapIterator->next();
@@ -1510,8 +1513,11 @@ sub next {
# BC branch and gets to C, it will see F as the only next resource, but it's
# one level lower. Thus, this is the end of the branch, since there are no
# more resources added to this level or above.
+ # We don't do this if the examined resource is the finish resource,
+ # because the condition given above is true, but the "END_MAP" will
+ # take care of things and we should already be at depth 0.
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH};
- if ($isEndOfBranch) { # **9**
+ if ($isEndOfBranch && $here != $self->{FINISH_RESOURCE}) { # **9**
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH();
}
@@ -2005,10 +2011,7 @@ sub answerdate {
}
return $self->parmval("answerdate", $part);
}
-sub awarded {
- (my $self, my $part) = @_;
- return $self->parmval("awarded", $part);
-}
+sub awarded { my $self = shift; return $self->queryRestoreHash('awarded', shift); }
sub duedate {
(my $self, my $part) = @_;
return $self->parmval("duedate", $part);
@@ -2033,24 +2036,18 @@ sub tol {
(my $self, my $part) = @_;
return $self->parmval("tol", $part);
}
-sub tries {
- my $self = shift;
- my $part = shift;
- $part = '0' if (!defined($part));
-
- # Make sure return hash is loaded, should error check
- $self->getReturnHash();
-
- my $tries = $self->{RETURN_HASH}->{'resource.'.$part.'.tries'};
- if (!defined($tries)) {return '0';}
+sub tries {
+ my $self = shift;
+ my $tries = $self->queryRestoreHash('tries', shift);
+ if (!defined($tries)) { return '0';}
return $tries;
}
sub type {
(my $self, my $part) = @_;
return $self->parmval("type", $part);
}
-sub weight {
- (my $self, my $part) = @_;
+sub weight {
+ my $self = shift; my $part = shift;
return $self->parmval("weight", $part);
}
@@ -2312,14 +2309,9 @@ sub ATTEMPTED { return 16; }
sub getCompletionStatus {
my $self = shift;
- my $part = shift;
- $part = "0" if (!defined($part));
return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE});
- # Make sure return hash exists
- $self->getReturnHash();
-
- my $status = $self->{RETURN_HASH}->{'resource.'.$part.'.solved'};
+ my $status = $self->queryRestoreHash('solved', shift);
# Left as seperate if statements in case we ever do more with this
if ($status eq 'correct_by_student') {return $self->CORRECT;}
@@ -2331,6 +2323,18 @@ sub getCompletionStatus {
return $self->NOT_ATTEMPTED;
}
+sub queryRestoreHash {
+ my $self = shift;
+ my $hashentry = shift;
+ my $part = shift;
+ $part = "0" if (!defined($part));
+ return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE});
+
+ $self->getReturnHash();
+
+ return $self->{RETURN_HASH}->{'resource.'.$part.'.'.$hashentry};
+}
+
=pod
B
@@ -2456,7 +2460,11 @@ sub getNext {
# Don't remember it if the student doesn't have browse priviledges
# future note: this may properly belong in the client of the resource
- my $browsePriv = &Apache::lonnet::allowed('bre', $self->src);
+ my $browsePriv = $self->{BROWSE_PRIV};
+ if (!defined($browsePriv)) {
+ $browsePriv = &Apache::lonnet::allowed('bre', $self->src);
+ $self->{BROWSE_PRIV} = $browsePriv;
+ }
if (!($browsePriv ne '2' && $browsePriv ne 'F')) {
push @branches, $next;
}
@@ -2475,7 +2483,11 @@ sub getPrevious {
# Don't remember it if the student doesn't have browse priviledges
# future note: this may properly belong in the client of the resource
- my $browsePriv = &Apache::lonnet::allowed('bre', $self->src);
+ my $browsePriv = $self->{BROWSE_PRIV};
+ if (!defined($browsePriv)) {
+ $browsePriv = &Apache::lonnet::allowed('bre', $self->src);
+ $self->{BROWSE_PRIV} = $browsePriv;
+ }
if (!($browsePriv ne '2' && $browsePriv ne 'F')) {
push @branches, $prev;
}