--- loncom/interface/lonnavmaps.pm 2003/03/20 20:40:42 1.129.2.2 +++ loncom/interface/lonnavmaps.pm 2003/02/06 22:58:12 1.139 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.129.2.2 2003/03/20 20:40:42 albertel Exp $ +# $Id: lonnavmaps.pm,v 1.139 2003/02/06 22:58:12 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,6 +46,69 @@ use Apache::Constants qw(:common :http); use Apache::loncommon(); use POSIX qw (floor strftime); +my %navmaphash; +my %parmhash; + +# symbolic constants +sub SYMB { return 1; } +sub URL { return 2; } +sub NOTHING { return 3; } + +# Some data + +# Keep these mappings in sync with lonquickgrades, which uses the colors +# instead of the icons. +my %statusIconMap = + ( Apache::lonnavmaps::resource->NETWORK_FAILURE => '', + Apache::lonnavmaps::resource->NOTHING_SET => '', + Apache::lonnavmaps::resource->CORRECT => 'navmap.correct.gif', + Apache::lonnavmaps::resource->EXCUSED => 'navmap.correct.gif', + Apache::lonnavmaps::resource->PAST_DUE_NO_ANSWER => 'navmap.wrong.gif', + Apache::lonnavmaps::resource->PAST_DUE_ANSWER_LATER => 'navmap.wrong.gif', + Apache::lonnavmaps::resource->ANSWER_OPEN => 'navmap.wrong.gif', + Apache::lonnavmaps::resource->OPEN_LATER => '', + Apache::lonnavmaps::resource->TRIES_LEFT => 'navmap.open.gif', + Apache::lonnavmaps::resource->INCORRECT => 'navmap.wrong.gif', + Apache::lonnavmaps::resource->OPEN => 'navmap.open.gif', + Apache::lonnavmaps::resource->ATTEMPTED => 'navmap.open.gif' ); + +my %iconAltTags = + ( 'navmap.correct.gif' => 'Correct', + 'navmap.wrong.gif' => 'Incorrect', + 'navmap.open.gif' => 'Open' ); + +# Defines a status->color mapping, null string means don't color +my %colormap = + ( Apache::lonnavmaps::resource->NETWORK_FAILURE => '', + Apache::lonnavmaps::resource->CORRECT => '', + Apache::lonnavmaps::resource->EXCUSED => '#3333FF', + Apache::lonnavmaps::resource->PAST_DUE_ANSWER_LATER => '', + Apache::lonnavmaps::resource->PAST_DUE_NO_ANSWER => '', + Apache::lonnavmaps::resource->ANSWER_OPEN => '#006600', + Apache::lonnavmaps::resource->OPEN_LATER => '', + Apache::lonnavmaps::resource->TRIES_LEFT => '', + Apache::lonnavmaps::resource->INCORRECT => '', + Apache::lonnavmaps::resource->OPEN => '', + Apache::lonnavmaps::resource->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 = "#FF0000"; + +sub cleanup { + if (tied(%navmaphash)){ + &Apache::lonnet::logthis('Cleanup navmaps: navmaphash'); + unless (untie(%navmaphash)) { + &Apache::lonnet::logthis('Failed cleanup navmaps: navmaphash'); + } + } + if (tied(%parmhash)){ + &Apache::lonnet::logthis('Cleanup navmaps: parmhash'); + unless (untie(%parmhash)) { + &Apache::lonnet::logthis('Failed cleanup navmaps: parmhash'); + } + } +} + sub handler { my $r = shift; real_handler($r); @@ -127,10 +190,9 @@ sub real_handler { } # Determine where the "here" marker is and where the screen jumps to. - my $SYMB = 1; my $URL = 2; my $NOTHING = 3; # symbolic constants - my $hereType; # the type of marker, $SYMB, $URL, or $NOTHING + my $hereType; # the type of marker, SYMB, URL, or NOTHING my $here; # the actual URL or SYMB for the here marker - my $jumpType; # The type of the thing we have a jump for, $SYMB or $URL + my $jumpType; # The type of the thing we have a jump for, SYMB or URL my $jump; # the SYMB/URL of the resource we need to jump to if ( $ENV{'form.alreadyHere'} ) { # we came from a user's manipulation of the nav page @@ -138,7 +200,7 @@ sub real_handler { # from the querystring, and get the new "jump" marker $hereType = $ENV{'form.hereType'}; $here = $ENV{'form.here'}; - $jumpType = $ENV{'form.jumpType'} || $NOTHING; + $jumpType = $ENV{'form.jumpType'} || NOTHING(); $jump = $ENV{'form.jump'}; } else { # the user is visiting the nav map from the remote # We're coming from the remote. We have either a url, a symb, or nothing, @@ -146,7 +208,7 @@ sub real_handler { # Preference: Symb if ($ENV{'form.symb'}) { - $hereType = $jumpType = $SYMB; + $hereType = $jumpType = SYMB(); $here = $jump = $ENV{'form.symb'}; } elsif ($ENV{'form.postdata'}) { # couldn't find a symb, is there a URL? @@ -154,11 +216,11 @@ sub real_handler { $currenturl=~s/^http\:\/\///; $currenturl=~s/^[^\/]+//; - $hereType = $jumpType = $URL; + $hereType = $jumpType = URL; $here = $jump = $currenturl; } else { # Nothing - $hereType = $jumpType = $NOTHING; + $hereType = $jumpType = NOTHING(); } } @@ -190,55 +252,7 @@ sub real_handler { return OK; } - # Grab a resource object so we have access to the constants; this - # is technically not proper, but should be harmless - my $res = $navmap->firstResource(); - - # These are some data tables, which make it easy to change some of - # of the specific visualization parameters if desired. - - # Defines a status->color mapping, null string means don't color - my %colormap = - ( $res->NETWORK_FAILURE => '', - $res->CORRECT => '', - $res->EXCUSED => '#3333FF', - $res->PAST_DUE_ANSWER_LATER => '', - $res->PAST_DUE_NO_ANSWER => '', - $res->ANSWER_OPEN => '#006600', - $res->OPEN_LATER => '', - $res->TRIES_LEFT => '', - $res->INCORRECT => '', - $res->OPEN => '', - $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 = "#FF0000"; - - # Keep these mappings in sync with lonquickgrades, which uses the colors - # instead of the icons. - my %statusIconMap = - ( $res->NETWORK_FAILURE => '', - $res->NOTHING_SET => '', - $res->CORRECT => 'navmap.correct.gif', - $res->EXCUSED => 'navmap.correct.gif', - $res->PAST_DUE_NO_ANSWER => 'navmap.wrong.gif', - $res->PAST_DUE_ANSWER_LATER => 'navmap.wrong.gif', - $res->ANSWER_OPEN => 'navmap.wrong.gif', - $res->OPEN_LATER => '', - $res->TRIES_LEFT => 'navmap.open.gif', - $res->INCORRECT => 'navmap.wrong.gif', - $res->OPEN => 'navmap.open.gif', - $res->ATTEMPTED => 'navmap.open.gif' ); - - my %iconAltTags = - ( 'navmap.correct.gif' => 'Correct', - 'navmap.wrong.gif' => 'Incorrect', - 'navmap.open.gif' => 'Open' ); - - my %condenseStatuses = - ( $res->NETWORK_FAILURE => 1, - $res->NOTHING_SET => 1, - $res->CORRECT => 1 ); + my $res = "Apache::lonnavmaps::resource"; my %filterHash; # Figure out what we're not displaying @@ -248,10 +262,6 @@ sub real_handler { } } - # Is this a new-style course? If so, we want to suppress showing the top-level - # maps in their own folders, in favor of "inlining" them. - my $topResource = $navmap->getById("0.0"); - # Begin the HTML table # four cols: resource + indent, chat+feedback, icon, text string $r->print('
\n"); - - # Print the anchor if necessary - if ($counter == $currentJumpIndex - $currentJumpDelta ) { - $r->print(''); - $displayedJumpMarker = 1; - } - - # print indentation - for (my $i = 0; $i < $indentLevel - $deltalevel; $i++) { - $r->print($indentString); - } - - $r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n"); - - my $curMarkerBegin = ""; - my $curMarkerEnd = ""; - - # Is this the current resource? - if (!$displayedHereMarker && - (($hereType == $SYMB && $curRes->symb eq $here) || - ($hereType == $URL && $curRes->src eq $here))) { - $curMarkerBegin = '> '; - $curMarkerEnd = ' <'; - $displayedHereMarker = 1; - } - - if ($curRes->is_problem() && $part ne "" && !$condensed) { - $partLabel = " (Part $part)"; - $title = ""; - } - if ($condensed && $curRes->countParts() > 1) { - $nonLinkedText .= ' (' . $curRes->countParts() . ' parts)'; - } - - $r->print(" $curMarkerBegin$title$partLabel $curMarkerEnd $nonLinkedText"); - - #if ($curRes->{RESOURCE_ERROR}) { - # $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down", - # 'Host down')); - # } - - $r->print(" | \n"); - - # SECOND COL: Is there text, feedback, errors?? - my $discussionHTML = ""; my $feedbackHTML = ""; my $errorHTML = ""; - - if ($curRes->hasDiscussion()) { - $discussionHTML = $linkopen . - '$discussionHTML$feedbackHTML$errorHTML | "); - - # Is this the first displayed part of a multi-part problem - # that has not been condensed, so we should suppress these two - # columns so we don't display useless status info about part - # "0"? - my $firstDisplayed = !$condensed && $multipart && $part eq "0"; - - # THIRD COL: Problem status icon - if ($curRes->is_problem() && - !$firstDisplayed) { - my $icon = $statusIconMap{$curRes->status($part)}; - my $alt = $iconAltTags{$icon}; - if ($icon) { - $r->print("$linkopen | \n");
- } else {
- $r->print("\n"); - } - } else { # not problem, no icon - $r->print(" | \n"); - } - - # FOURTH COL: Text description - $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(" |