--- loncom/interface/lonnavmaps.pm 2002/10/11 21:29:18 1.74 +++ loncom/interface/lonnavmaps.pm 2002/10/14 18:41:02 1.80 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.74 2002/10/11 21:29:18 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.80 2002/10/14 18:41:02 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -823,7 +823,7 @@ sub new_handle { # Initialize the nav map my $navmap = Apache::lonnavmaps::navmap->new( $ENV{"request.course.fn"}.".db", - $ENV{"request.course.fn"}."_parms.db", 1); + $ENV{"request.course.fn"}."_parms.db", 1, 1); if (!defined($navmap)) { @@ -917,7 +917,13 @@ sub new_handle { my $currenturl = $ENV{'form.postdata'}; $currenturl=~s/^http\:\/\///; $currenturl=~s/^[^\/]+//; - my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl); + # 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"; $r->print('Show All Resources

'); @@ -935,7 +941,7 @@ sub new_handle { # loop should be obvious. # Here's a simple example of the iterator. # If there is a current resource - if ($currenturl) { + if ($currenturl && !$ENV{'form.alreadyHere'}) { # Give me every resource... my $mapIterator = $navmap->getIterator(undef, undef, {}, 1); my $found != 0; @@ -971,6 +977,7 @@ sub new_handle { my $now = time(); my $in24Hours = $now + 24 * 60 * 60; my $depth = 1; + my $displayedHereMarker = 0; # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}" # code in iterator->next), so ignore the first one @@ -1070,7 +1077,7 @@ sub new_handle { } else { @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 + # with only one part without loss } # Display one part, in event of network error. @@ -1126,7 +1133,7 @@ sub new_handle { my $mapId = $curRes->map_pc(); my $nowOpen = !defined($filterHash{$mapId}); $icon = $nowOpen ? - "folder_closed.gif" : "folder_opened.gif"; + "navmap.folder.closed.gif" : "navmap.folder.open.gif"; $icon = "\"\""; $linkopen = "OPEN() && - $curRes->duedate() < time()+(24*60*60)) { + if ($status == $curRes->OPEN() && $curRes->duedate() && + $curRes->duedate() < time()+(24*60*60) && + $curRes->duedate() > time()) { + $color = $hurryUpColor; + } + # Special case: If this is the last try, and there is + # more then one available, give a bit of urgency + my $tries = $curRes->tries($part); + my $maxtries = $curRes->maxtries($part); + if ($tries && $maxtries && $maxtries > 1 && + $maxtries - $tries == 1) { $color = $hurryUpColor; } if ($color ne "") { @@ -1158,7 +1174,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++) { @@ -1171,9 +1187,10 @@ sub new_handle { my $curMarkerEnd = ""; # Is this the current resource? - if ($curRes->src() eq $currenturl) { + if ($curRes->src() eq $currenturl && !$displayedHereMarker) { $curMarkerBegin = '> '; $curMarkerEnd = ' <'; + $displayedHereMarker = 1; } if ($curRes->is_problem() && $part ne "0" && !$condensed) { @@ -1212,7 +1229,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 @@ -1225,7 +1242,7 @@ sub new_handle { my $icon = $statusIconMap{$curRes->status($part)}; my $alt = $iconAltTags{$icon}; if ($icon) { - $r->print("$linkopen\"$alt\"$linkclose\n"); + $r->print("$linkopen\"$alt\"$linkclose\n"); } else { $r->print("\n"); } @@ -1234,7 +1251,7 @@ sub new_handle { } # FOURTH COL: Text description - $r->print("\n"); + $r->print("\n"); if ($curRes->kind() eq "res" && $curRes->is_problem() && @@ -1323,7 +1340,7 @@ sub getDescription { return "Open " . timeToHumanString($res->opendate($part)); } if ($status == $res->OPEN) { - if ($res->duedate()) { + if ($res->duedate($part)) { return "Due " . timeToHumanString($res->duedate($part)); } else { return "Open, no due date"; @@ -1345,9 +1362,15 @@ sub getDescription { return "Not yet graded."; } if ($status == $res->TRIES_LEFT) { - my $tries = $res->tries(); - my $maxtries = $res->maxtries(); - my $triesString = "($tries of $maxtries tries used)"; + my $tries = $res->tries($part); + my $maxtries = $res->maxtries($part); + my $triesString = ""; + if ($tries && $maxtries) { + $triesString = "($tries of $maxtries tries used)"; + if ($maxtries > 1 && $maxtries - $tries == 1) { + $triesString = "$triesString"; + } + } if ($res->duedate()) { return "Due " . timeToHumanString($res->duedate($part)) . " $triesString"; @@ -2821,7 +2844,7 @@ sub status { # If it's WRONG... if ($completionStatus == INCORRECT || $completionStatus == INCORRECT_BY_OVERRIDE) { # and there are TRIES LEFT: - if ($self->tries() < $self->maxtries()) { + if ($self->tries($part) < $self->maxtries($part) || !$self->maxtries($part)) { return TRIES_LEFT; } return INCORRECT; # otherwise, return orange; student can't fix this