--- loncom/interface/lonnavmaps.pm 2002/10/15 19:51:25 1.82
+++ loncom/interface/lonnavmaps.pm 2002/10/28 13:58:58 1.87
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.82 2002/10/15 19:51:25 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.87 2002/10/28 13:58:58 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -849,10 +849,6 @@ sub new_handle {
$r->print('
Discussions'.
'
New message (click to open)
');
}
- #if (($currenturl=~/^\/res/) &&
- # ($currenturl!~/^\/res\/adm/)) {
- # $r->print('Current Location
');
- #}
# Check that it's defined
if (!($navmap->courseMapDefined())) {
@@ -880,7 +876,7 @@ sub new_handle {
$res->NOTHING_SET => '' );
# And a special case in the nav map; what to do when the assignment
# is not yet done and due in less then 24 hours
- my $hurryUpColor = "#FFCCCC";
+ my $hurryUpColor = "#FF0000";
my %statusIconMap =
( $res->NETWORK_FAILURE => '',
@@ -894,7 +890,7 @@ sub new_handle {
$res->TRIES_LEFT => 'navmap.open.gif',
$res->INCORRECT => 'navmap.wrong.gif',
$res->OPEN => 'navmap.open.gif',
- $res->ATTEMPTED => '' );
+ $res->ATTEMPTED => 'navmap.open.gif' );
my %iconAltTags =
( 'navmap.correct.gif' => 'Correct',
@@ -929,7 +925,7 @@ sub new_handle {
# Begin the HTML table
# four cols: resource + indent, chat+feedback, icon, text string
- $r->print('
' ."\n");
+ $r->print('' ."\n");
my $condition = 0;
if ($ENV{'form.condition'}) {
@@ -944,7 +940,7 @@ sub new_handle {
if ($currenturl && !$ENV{'form.alreadyHere'}) {
# Give me every resource...
my $mapIterator = $navmap->getIterator(undef, undef, {}, 1);
- my $found != 0;
+ my $found = 0;
my $depth = 1;
$mapIterator->next(); # discard the first BEGIN_MAP
my $curRes = $mapIterator->next();
@@ -1075,11 +1071,18 @@ sub new_handle {
}
} else {
- @parts[0] = "0"; # this is to get past foreach loop below
+ $parts[0] = "0"; # this is to get past foreach loop below
# you can consider a non-problem resource as a resource
# with only one part without loss
}
+ # Is it a multipart problem with a single part, now in
+ # @parts with "0" filtered out? If so, forget it's a multi-part
+ # problem and treat it like a single-part problem.
+ if ( scalar(@parts) == 1 ) {
+ $multipart = 0;
+ }
+
# Display one part, in event of network error.
# If this is a single part, we can at least show the correct
# status, but if it's multipart, we're lost.
@@ -1150,13 +1153,16 @@ sub new_handle {
}
my $colorizer = "";
+ my $color;
if ($curRes->is_problem()) {
my $status = $curRes->status($part);
- my $color = $colormap{$status};
+ $color = $colormap{$status};
# Special case in the navmaps: If in less then
# 24 hours, give it a bit of urgency
- if ($status == $curRes->OPEN() && $curRes->duedate() &&
+ if (($status == $curRes->OPEN() || $status == $curRes->ATTEMPTED() ||
+ $status == $curRes->TRIES_LEFT())
+ && $curRes->duedate() &&
$curRes->duedate() < time()+(24*60*60) &&
$curRes->duedate() > time()) {
$color = $hurryUpColor;
@@ -1179,7 +1185,7 @@ sub new_handle {
}
# FIRST COL: The resource indentation, branch icon, and name
- $r->print(" \n");
+ $r->print(" |
\n");
# print indentation
for (my $i = 0; $i < $indentLevel - $deltalevel; $i++) {
@@ -1202,7 +1208,7 @@ sub new_handle {
$partLabel = " (Part $part)";
$title = "";
}
- if ($multipart && $condensed && $curRes->countParts > 1) {
+ if ($multipart && $condensed) {
$nonLinkedText .= ' (' . $curRes->countParts() . ' parts)';
}
@@ -1210,12 +1216,12 @@ sub new_handle {
if ($curRes->{RESOURCE_ERROR}) {
$r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",
- 'Host down'));
+ 'Host down'));
}
my $discussionHTML = ""; my $feedbackHTML = "";
- # SECOND COL: Is there text or feedback?
+ # SECOND COL: Is there text, feedback, errors??
if ($curRes->hasDiscussion()) {
$discussionHTML = $linkopen .
' ' .
@@ -1234,7 +1240,7 @@ sub new_handle {
}
}
- $r->print(" | $discussionHTML$feedbackHTML | ");
+ $r->print("$discussionHTML$feedbackHTML | ");
# Is this the first displayed part of a multi-part problem
# that has not been condensed, so we should suppress these two
@@ -1247,27 +1253,30 @@ sub new_handle {
my $icon = $statusIconMap{$curRes->status($part)};
my $alt = $iconAltTags{$icon};
if ($icon) {
- $r->print("$linkopen $linkclose | \n");
+ $r->print("$linkopen $linkclose | \n");
} else {
- $r->print(" | \n");
+ $r->print(" | \n");
}
} else { # not problem, no icon
- $r->print(" | \n");
+ $r->print(" | \n");
}
# FOURTH COL: Text description
- $r->print("\n");
+ #$r->print(" | \n");
+ $r->print(" | \n");
if ($curRes->kind() eq "res" &&
$curRes->is_problem() &&
!$firstDisplayed) {
+ $r->print ("") if ($color);
$r->print (getDescription($curRes, $part));
+ $r->print ("") if ($color);
}
if ($curRes->is_map() && advancedUser() && $curRes->randompick()) {
$r->print('(randomly select ' . $curRes->randompick() .')');
}
- $r->print(" |
\n");
+ $r->print(" \n");
}
}
$curRes = $mapIterator->next();
@@ -1470,7 +1479,7 @@ sub timeToHumanString {
# Less then 5 days away, display day of the week and
# HH:MM
if ( $delta < $day * 5 ) {
- my $timeStr = strftime("%A at %I:%M %P", localtime($time));
+ my $timeStr = strftime("%A, %b %e at %I:%M %P", localtime($time));
$timeStr =~ s/12:00 am/midnight/;
$timeStr =~ s/12:00 pm/noon/;
return ($inPast ? "last " : "next ") .
@@ -1662,6 +1671,8 @@ sub new {
$self->{EMAIL_STATUS} = \%emailstatus;
}
+
+ $self->{PARM_CACHE} = {};
bless($self);
@@ -1783,6 +1794,21 @@ sub finishResource {
sub parmval {
my $self = shift;
my ($what,$symb)=@_;
+ my $hashkey = $what."|||".$symb;
+
+ if (defined($self->{PARM_CACHE}->{$hashkey})) {
+ return $self->{PARM_CACHE}->{$hashkey};
+ }
+
+ my $result = $self->parmval_real($what, $symb);
+ $self->{PARM_CACHE}->{$hashkey} = $result;
+ return $result;
+}
+
+sub parmval_real {
+ my $self = shift;
+ my ($what,$symb) = @_;
+
my $cid=$ENV{'request.course.id'};
my $csec=$ENV{'request.course.sec'};
my $uname=$ENV{'user.name'};
@@ -2244,15 +2270,15 @@ These are methods that help you retrieve
=item * B: Returns the "to" value from the compiled nav map. (It is likely you want to use B instead.)
-=item * B: Returns the type of the resource, "start", "normal", or "finish".
-
=back
=cut
# These info functions can be used directly, as they don't return
# resource information.
+sub comesfrom { my $self=shift; return $self->navHash("comesfrom_", 1); }
sub ext { my $self=shift; return $self->navHash("ext_", 1) eq 'true:'; }
+sub from { my $self=shift; return $self->navHash("from_", 1); }
sub goesto { my $self=shift; return $self->navHash("goesto_", 1); }
sub kind { my $self=shift; return $self->navHash("kind_", 1); }
sub randomout { my $self=shift; return $self->navHash("randomout_", 1); }
@@ -2275,7 +2301,6 @@ sub symb {
}
sub title { my $self=shift; return $self->navHash("title_", 1); }
sub to { my $self=shift; return $self->navHash("to_", 1); }
-sub type { my $self=shift; return $self->navHash("type_", 1); }
=pod
@@ -2491,7 +2516,7 @@ sub getReturnHash {
my $self = shift;
if (!defined($self->{RETURN_HASH})) {
- my %tmpHash = &Apache::lonnet::restore($self->symb());
+ my %tmpHash = &Apache::lonnet::restore($self->symb());
$self->{RETURN_HASH} = \%tmpHash;
}
}
@@ -2537,7 +2562,7 @@ sub hasDiscussion {
sub getFeedback {
my $self = shift;
- return $self->{NAV_MAP}->getFeedback($self->symb());
+ return $self->{NAV_MAP}->getFeedback($self->src());
}
=pod
@@ -2867,20 +2892,18 @@ sub status {
=over 4
-=item * B(): Gets the next resource in the navmap after this one.
+=item * B($alreadySeenHashRef): Retreive an array of the possible next resources after this one. Always returns an array, even in the one- or zero-element case. The "alreadySeenHashRef" is an optional parameter that can be passed in to the method. If $$alreadySeenHashRef{$res->id()} is true in that hash, getNext will not return it in the list. In other words, you can use it to suppress resources you've already seen in the getNext method directly.
-=cut
+=item * B($alreadySeenHashRef): Retreive an array of the possible previous resources from this one. Always returns an array, even in the one- or zero-element case. $alreadySeenHashRef is the same as in getNext.
-# For the simple single-link case, to get from a resource to the next
-# resource, you need to look up the "to_" link in the nav hash, then
-# follow that with the "goesto_" link.
+=cut
sub getNext {
my $self = shift;
my $alreadySeenHash = shift;
my @branches;
my $to = $self->to();
- foreach my $branch ( split(/\,/, $to) ) {
+ foreach my $branch ( split(/,/, $to) ) {
my $choice = $self->{NAV_MAP}->getById($branch);
my $next = $choice->goesto();
$next = $self->{NAV_MAP}->getById($next);
@@ -2896,6 +2919,28 @@ sub getNext {
}
return \@branches;
}
+
+sub getPrevious {
+ my $self = shift;
+ my $alreadySeenHash = shift;
+ my @branches;
+ my $from = $self->from();
+ foreach my $branch ( split /,/, $from) {
+ my $choice = $self->{NAV_MAP}->getById($branch);
+ my $prev = $choice->comesfrom();
+ $prev = $self->{NAV_MAP}->getById($prev);
+
+ # Skip it if we've already seen it or the user doesn't have
+ # browse privs
+ my $browsePriv = &Apache::lonnet::allowed('bre', $self->src);
+ if (!defined($alreadySeenHash) ||
+ !defined($alreadySeenHash->{$prev->{ID}}) ||
+ ($browsePriv ne '2' && $browsePriv ne 'F')) {
+ push @branches, $prev;
+ }
+ }
+ return \@branches;
+}
=pod