Diff for /loncom/interface/lonnavmaps.pm between versions 1.71 and 1.75

version 1.71, 2002/10/08 20:39:43 version 1.75, 2002/10/11 21:34:42
Line 1 Line 1
   
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Navigate Maps Handler  # Navigate Maps Handler
 #  #
Line 44  use strict; Line 45  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonnet();
 use Apache::loncommon();  use Apache::loncommon();
 use HTML::TokeParser;  
 use GDBM_File;  use GDBM_File;
   use POSIX qw (floor strftime);
   
 # -------------------------------------------------------------- Module Globals  # -------------------------------------------------------------- Module Globals
 my %hash;  my %hash;
Line 842  sub new_handle { Line 843  sub new_handle {
     $r->rflush();      $r->rflush();
     if ($navmap->{LAST_CHECK}) {      if ($navmap->{LAST_CHECK}) {
         $r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '.          $r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '.
                   timeToHumanString($navmap->{LAST_CHECK}).                    strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).
                   '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>');                     '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'); 
     } else {      } else {
         $r->print('<img src="/adm/lonMisc/chat.gif"> Discussions'.          $r->print('<img src="/adm/lonMisc/chat.gif"> Discussions'.
Line 916  sub new_handle { Line 917  sub new_handle {
     my $currenturl = $ENV{'form.postdata'};      my $currenturl = $ENV{'form.postdata'};
     $currenturl=~s/^http\:\/\///;      $currenturl=~s/^http\:\/\///;
     $currenturl=~s/^[^\/]+//;      $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('<a href="navmaps?condition=1&filter=">Show All Resources</a><br /><br />');      $r->print('<a href="navmaps?condition=1&filter=">Show All Resources</a><br /><br />');
   
Line 929  sub new_handle { Line 936  sub new_handle {
         $condition = 1;          $condition = 1;
     }      }
   
     my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, $condition);      # This needs to be updated to use symbs from the remote, 
     my $curRes = $mapIterator->next();      # instead of uris. The changes to this and the main rendering
       # loop should be obvious.
       # Here's a simple example of the iterator.
       # If there is a current resource
       if ($currenturl && !$ENV{'form.alreadyHere'}) {
           # Give me every resource...
           my $mapIterator = $navmap->getIterator(undef, undef, {}, 1);
           my $found != 0;
           my $depth = 1;
           $mapIterator->next(); # discard the first BEGIN_MAP
           my $curRes = $mapIterator->next();
           
           while ($depth > 0 && !$found) {
               if (ref($curRes) && $curRes->src() eq $currenturl) {
                   # If this is the correct resource, be sure to 
                   # show it by making sure the containing maps
                   # are open.
   
                   my $mapStack = $mapIterator->getStack();
                   for my $map (@{$mapStack}) {
                       if ($condition) {
                           undef $filterHash{$map->map_pc()};
                       } else {
                           $filterHash{$map->map_pc()} = 1;
                       }
                   }
                   $found = 1;
               }
               $curRes = $mapIterator->next();
           }
       }
   
     undef $res; # so we don't accidentally use it later      undef $res; # so we don't accidentally use it later
     my $indentLevel = -1;      my $indentLevel = 0;
     my $indentString = "<img src=\"/adm/lonIcons/whitespace1.gif\" width=\"25\" height=\"1\" alt=\"\" border=\"0\" />";      my $indentString = "<img src=\"/adm/lonIcons/whitespace1.gif\" width=\"25\" height=\"1\" alt=\"\" border=\"0\" />";
   
     my $isNewBranch = 0;      my $isNewBranch = 0;
     my $now = time();      my $now = time();
     my $in24Hours = $now + 24 * 60 * 60;      my $in24Hours = $now + 24 * 60 * 60;
       my $depth = 1;
   
       # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}"
       # code in iterator->next), so ignore the first one
       my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash,
                                              $condition);
       $mapIterator->next();
       my $curRes = $mapIterator->next();
   
     while ($curRes != $mapIterator->END_MAP()) {      while ($depth > 0) {
         if ($curRes == $mapIterator->BEGIN_MAP() ||          if ($curRes == $mapIterator->BEGIN_MAP() ||
             $curRes == $mapIterator->BEGIN_BRANCH()) {              $curRes == $mapIterator->BEGIN_BRANCH()) {
             $indentLevel++;              $indentLevel++;
Line 951  sub new_handle { Line 997  sub new_handle {
         if ($curRes == $mapIterator->BEGIN_BRANCH()) {          if ($curRes == $mapIterator->BEGIN_BRANCH()) {
             $isNewBranch = 1;              $isNewBranch = 1;
         }          }
           if ($curRes == $mapIterator->BEGIN_MAP()) {
               $depth++;
           }
           if ($curRes == $mapIterator->END_MAP()) {
               $depth--;
           }
   
         # Is this resource being blotted out?          # Is this resource being blotted out?
         if (ref($curRes) && !advancedUser() && $curRes->randomout()) {          if (ref($curRes) && !advancedUser() && $curRes->randomout()) {
Line 1095  sub new_handle { Line 1147  sub new_handle {
                 if ($curRes->is_problem()) {                  if ($curRes->is_problem()) {
                     my $status = $curRes->status($part);                      my $status = $curRes->status($part);
                     my $color = $colormap{$status};                      my $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() < time()+(24*60*60)) {
                           $color = $hurryUpColor;
                       }
                     if ($color ne "") {                      if ($color ne "") {
                         $colorizer = "bgcolor=\"$color\"";                          $colorizer = "bgcolor=\"$color\"";
                     }                      }
Line 1114  sub new_handle { Line 1173  sub new_handle {
   
                 $r->print("  ${newBranchText}${linkopen}$icon${linkclose}\n");                  $r->print("  ${newBranchText}${linkopen}$icon${linkclose}\n");
   
                   my $curMarkerBegin = "";
                   my $curMarkerEnd = "";
   
                   # Is this the current resource?
                   if ($curRes->src() eq $currenturl) {
                       $curMarkerBegin = '<a name="curloc" /><font color="red" size="+2">&gt; </font>';
                       $curMarkerEnd = '<font color="red" size="+2"> &lt;</font>';
                   }
   
                 if ($curRes->is_problem() && $part ne "0" && !$condensed) {                   if ($curRes->is_problem() && $part ne "0" && !$condensed) { 
                     $partLabel = " (Part $part)";                       $partLabel = " (Part $part)"; 
                     $title = "";                      $title = "";
Line 1122  sub new_handle { Line 1190  sub new_handle {
                     $nonLinkedText .= ' (' . $curRes->countParts() . ' parts)';                      $nonLinkedText .= ' (' . $curRes->countParts() . ' parts)';
                 }                  }
   
                 $r->print("  <a href=\"$link\">$title$partLabel</a> $nonLinkedText");                  $r->print("  $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText");
   
                 if ($curRes->{RESOURCE_ERROR}) {                  if ($curRes->{RESOURCE_ERROR}) {
                     $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",                      $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",
Line 1258  sub getDescription { Line 1326  sub getDescription {
         return "Not currently assigned.";          return "Not currently assigned.";
     }      }
     if ($status == $res->OPEN_LATER) {      if ($status == $res->OPEN_LATER) {
         return "Opens: " . timeToHumanString($res->opendate($part));          return "Open " . timeToHumanString($res->opendate($part));
     }      }
     if ($status == $res->OPEN) {      if ($status == $res->OPEN) {
         if ($res->duedate()) {          if ($res->duedate()) {
             return "Due: $status " . timeToHumanString($res->duedate($part));              return "Due " . timeToHumanString($res->duedate($part));
         } else {          } else {
             return "Open, no due date";              return "Open, no due date";
         }          }
     }      }
     if ($status == $res->PAST_DUE_ANSWER_LATER) {      if ($status == $res->PAST_DUE_ANSWER_LATER) {
         return "Answer opens: " . timeToHumanString($res->answerdate($part));          return "Answer open " . timeToHumanString($res->answerdate($part));
     }      }
     if ($status == $res->PAST_DUE_NO_ANSWER) {      if ($status == $res->PAST_DUE_NO_ANSWER) {
         return "Was Due: " . timeToHumanString($res->duedate($part));          return "Was due " . timeToHumanString($res->duedate($part));
     }      }
     if ($status == $res->ANSWER_OPEN) {      if ($status == $res->ANSWER_OPEN) {
         return "Answer available";          return "Answer available";
Line 1287  sub getDescription { Line 1355  sub getDescription {
         my $maxtries = $res->maxtries();          my $maxtries = $res->maxtries();
         my $triesString = "($tries of $maxtries tries used)";          my $triesString = "($tries of $maxtries tries used)";
         if ($res->duedate()) {          if ($res->duedate()) {
             return "Due: $status " . timeToHumanString($res->duedate($part)) .              return "Due " . timeToHumanString($res->duedate($part)) .
                 " $triesString";                  " $triesString";
         } else {          } else {
             return "No due date $triesString";              return "No due date $triesString";
Line 1299  sub advancedUser { Line 1367  sub advancedUser {
     return $ENV{'user.adv'};      return $ENV{'user.adv'};
 }  }
   
 # I want to change this into something more human-friendly. For  
 # now, this is a simple call to localtime. The final function  # timeToHumanString takes a time number and converts it to a
 # probably belongs in loncommon.  # human-readable representation, meant to be used in the following
   # manner:
   # print "Due $timestring"
   # print "Open $timestring"
   # print "Answer available $timestring"
   # Very, very, very, VERY English-only... goodness help a localizer on
   # this func...
 sub timeToHumanString {  sub timeToHumanString {
     my ($time) = @_;      my ($time) = @_;
     # zero, '0' and blank are bad times      # zero, '0' and blank are bad times
     if ($time) {      if (!$time) {
         return localtime($time);          return 'never';
     } else {      }
         return 'Never';  
       my $now = time();
   
       my @time = localtime($time);
       my @now = localtime($now);
   
       # Positive = future
       my $delta = $time - $now;
   
       my $minute = 60;
       my $hour = 60 * $minute;
       my $day = 24 * $hour;
       my $week = 7 * $day;
       my $inPast = 0;
   
       # Logic in comments:
       # Is it now? (extremely unlikely)
       if ( $delta == 0 ) {
           return "this instant";
       }
   
       if ($delta < 0) {
           $inPast = 1;
           $delta = -$delta;
       }
   
       # Is it in the future?
       if ( $delta > 0 ) {
           # Is it less then a minute away?
           my $tense = $inPast ? " ago" : "";
           my $prefix = $inPast ? "" : "in ";
           if ( $delta < $minute ) {
               if ($delta == 1) { return "${prefix}1 second$tense"; }
               return "$prefix$delta seconds$tense";
           }
   
           # Is it less then an hour away?
           if ( $delta < $hour ) {
               # If so, use minutes
               my $minutes = floor($delta / 60);
               if ($minutes == 1) { return "${prefix}1 minute$tense"; }
               return "$prefix$minutes minutes$tense";
           }
           
           # Is it less then 24 hours away? If so,
           # display hours + minutes
           if ( $delta < $hour * 24) {
               my $hours = floor($delta / $hour);
               my $minutes = floor(($delta % $hour) / $minute);
               my $hourString = "$hours hours";
               my $minuteString = ", $minutes minutes";
               if ($hours == 1) {
                   $hourString = "1 hour";
               }
               if ($minutes == 1) {
                   $minuteString = ", 1 minute";
               }
               if ($minutes == 0) {
                   $minuteString = "";
               }
               return "$prefix$hourString$minuteString$tense";
           }
   
           # 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));
               $timeStr =~ s/12:00 am/midnight/;
               $timeStr =~ s/12:00 pm/noon/;
               return ($inPast ? "last " : "next ") .
                   $timeStr;
           }
           
           # Is it this year?
           if ( $time[5] == $now[5]) {
               # Return on Month Day, HH:MM meridian
               my $timeStr = strftime("on %A, %b %e at %I:%M %P", localtime($time));
               $timeStr =~ s/12:00 am/midnight/;
               $timeStr =~ s/12:00 pm/noon/;
               return $timeStr;
           }
   
           # Not this year, so show the year
           my $timeStr = strftime("on %A, %b %e %G at %I:%M %P", localtime($time));
           $timeStr =~ s/12:00 am/midnight/;
           $timeStr =~ s/12:00 pm/noon/;
           return $timeStr;
     }      }
 }  }
   

Removed from v.1.71  
changed lines
  Added in v.1.75


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>