Diff for /loncom/interface/lonnavmaps.pm between versions 1.574 and 1.576

version 1.574, 2025/05/26 19:55:09 version 1.576, 2025/06/28 14:34:46
Line 637  sub getDescription { Line 637  sub getDescription {
   
     my $open = $res->opendate($part);      my $open = $res->opendate($part);
     my $due = $res->duedate($part);      my $due = $res->duedate($part);
       my $overdue = $res->overduedate($part);
     my $answer = $res->answerdate($part);      my $answer = $res->answerdate($part);
   
     if ($status == $res->NETWORK_FAILURE) {       if ($status == $res->NETWORK_FAILURE) { 
Line 690  sub getDescription { Line 691  sub getDescription {
     }      }
     if ($status == $res->OPEN) {      if ($status == $res->OPEN) {
         if ($due) {          if ($due) {
     if ($res->is_practice()) {              my $now = time;
  return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo;              if (($now >= $due) && ($overdue) && ($now < $overdue)) {
     } else {                  if ($res->is_practice()) {
  return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo;                      return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'start'),$res->symb(),'duedate',$part)).$slotinfo;
     }                  } else {
                       return &mt("Grace period ends [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'end'),$res->symb(),'grace',$part)).$slotinfo;
                   }
               } else {
                   if ($res->is_practice()) {
                       return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo;
                   } else {
                       return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo;
                   }
               }
         } else {          } else {
             return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo;              return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo;
         }          }
Line 1380  sub cmp_title { Line 1390  sub cmp_title {
 sub render {  sub render {
     my $args = shift;      my $args = shift;
     &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});      &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
     my $result = '';  
     # Configure the renderer.      # Configure the renderer.
     my $cols = $args->{'cols'};      my $cols = $args->{'cols'};
     if (!defined($cols)) {      if (!defined($cols)) {
         # no columns, no nav maps.          # no columns, no nav maps.
         return '';          return '';
     }      }
       my $legend = '';
       my $tools = '';
       my $result = '';
       my $tools_printed = 0;
       my $tablestarted = 0;
     my $navmap;      my $navmap;
     if (defined($args->{'navmap'})) {      if (defined($args->{'navmap'})) {
         $navmap = $args->{'navmap'};          $navmap = $args->{'navmap'};
Line 1604  sub render { Line 1618  sub render {
     # Print key?      # Print key?
     if ($printKey) {      if ($printKey) {
         my $location = &Apache::loncommon::lonhttpdurl("/adm/lonMisc");          my $location = &Apache::loncommon::lonhttpdurl("/adm/lonMisc");
         $result .= '<div class="LC_navtools">'."\n".          $legend = '<div class="LC_navtools">'."\n".
                    '<span class="LC_middle LC_right">'.&mt('Key').':</span>'.                    '<span class="LC_middle LC_right">'.&mt('Key').':</span>'.
                    '<span class="LC_middle LC_center">&nbsp;&nbsp;'.                    '<span class="LC_middle LC_center">&nbsp;&nbsp;'.
                    '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('Unread Discussion').                    '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('Unread Discussion').
                    '&nbsp;&nbsp;'.                    '&nbsp;&nbsp;'.
                    '<img src="'.$location.'/feedback.gif" alt="" /> '.                    '<img src="'.$location.'/feedback.gif" alt="" /> '.
                    &mt('New message (click to open)').                    &mt('New message (click to open)').
                    '</span></div>'.                    '</span></div>'.
                    '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";                    '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
     }      }
   
     if ($printCloseAll && !$args->{'resource_no_folder_link'}) {      if ($printCloseAll && !$args->{'resource_no_folder_link'}) {
Line 1632  sub render { Line 1646  sub render {
                               "location.href='$link'",$text);                                "location.href='$link'",$text);
             }              }
  } else {   } else {
     $result.= '<a href="'.$link.'">'.&mt($text).'</a>';      $tools = '<a href="'.$link.'">'.&mt($text).'</a>';
  }   }
         $result .= "\n";          $tools .= "\n";
     }      }
   
     # Check for any unread discussions in all resources.      # Check for any unread discussions in all resources.
Line 1646  sub render { Line 1660  sub render {
  my $time=time;   my $time=time;
         my $submit = &mt($markread);          my $submit = &mt($markread);
         my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"');          my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"');
  $result .= (<<END);   $tools .= (<<END);
     <form name="clearbubbles" method="post" action="/adm/feedback" aria-hidden="true">      <form name="clearbubbles" method="post" action="/adm/feedback" aria-hidden="true">
  <input type="hidden" name="navurl" value="$querystr" />   <input type="hidden" name="navurl" value="$querystr" />
  <input type="hidden" name="navtime" value="$time" />   <input type="hidden" name="navtime" value="$time" />
Line 1663  END Line 1677  END
     }      }
     if ($totdisc > 0) {      if ($totdisc > 0) {
  $haveDisc =~ s/:$//;   $haveDisc =~ s/:$//;
  $result .= (<<END);   $tools .= (<<END);
  <input type="hidden" name="navmaps" value="$haveDisc" />   <input type="hidden" name="navmaps" value="$haveDisc" />
 END  END
             }              }
  }   }
  $result .= <<END;   $tools .= <<END;
         <input type="submit" value="$submit" class="LC_visually_hidden" tabindex="-1" disabled="disabled" />          <input type="submit" value="$submit" class="LC_visually_hidden" tabindex="-1" disabled="disabled" />
     </form>      </form>
 END  END
Line 1693  END Line 1707  END
     }      }
   
     if ($args->{'caller'} eq 'navmapsdisplay') {      if ($args->{'caller'} eq 'navmapsdisplay') {
         $result .= &show_linkitems_toolbar($args,$condition);          $tools .= &show_linkitems_toolbar($args,$condition);
     } elsif ($args->{'sort_html'}) {       } elsif ($args->{'sort_html'}) { 
         $result.=$args->{'sort_html'};           $tools .= $args->{'sort_html'}; 
     }      }
   
     #$result .= "<br />\n";      #$tools .= "<br />\n";
     if ($r) {  
         $r->print($result);  
         $r->rflush();  
         $result = "";  
     }  
     # End parameter setting      # End parameter setting
       
     $result .= "<br />\n";  
   
     # Data      # Data
     if ($counter) {  
         $result.=&Apache::loncommon::start_data_table("LC_tableOfContent").  
                  &Apache::loncommon::start_data_table_header_row('LC_visually_hidden').  
                  '<th>'.&mt('Resource or Folder').'</th>'.  
                  '<th>'.&mt('Alerts').'</th>'.  
                  '<th>'.&mt('Status Icon').'</th>'.  
                  '<th>'.&mt('Date/Completion Status').'</th>'.  
                  &Apache::loncommon::end_data_table_row()."\n";  
     }  
   
     my $res = "Apache::lonnavmaps::resource";      my $res = "Apache::lonnavmaps::resource";
     my %condenseStatuses =      my %condenseStatuses =
Line 1956  END Line 1954  END
         }          }
   
         $args->{'counter'}++;          $args->{'counter'}++;
           unless ($tablestarted) {
               $result.=&Apache::loncommon::start_data_table("LC_tableOfContent").
                        &Apache::loncommon::start_data_table_header_row('LC_visually_hidden').
                        '<th>'.&mt('Resource or Folder').'</th>'.
                        '<th>'.&mt('Alerts').'</th>'.
                        '<th>'.&mt('Status Icon').'</th>'.
                        '<th>'.&mt('Date/Completion Status').'</th>'.
                        &Apache::loncommon::end_data_table_row()."\n";
                        $tablestarted = 1;
           }
   
         # Does it have multiple parts?          # Does it have multiple parts?
         $args->{'multipart'} = 0;          $args->{'multipart'} = 0;
Line 2106  END Line 2114  END
         }          }
   
         if ($r && $rownum % 20 == 0) {          if ($r && $rownum % 20 == 0) {
               unless ($tools_printed) {
                   $r->print($legend.$tools);
                   $legend = "";
                   $tools = "";
                   $tools_printed = 1;
               }
             $r->print($result);              $r->print($result);
             $result = "";              $result = "";
             $r->rflush();              $r->rflush();
Line 2121  END Line 2135  END
  }   }
     }      }
   
     if ($counter) {      if ($tablestarted) {
         $result.=&Apache::loncommon::end_data_table();          $result .= &Apache::loncommon::end_data_table();
     }      }
           
     # Print out the part that jumps to #curloc if it exists      # Print out the part that jumps to #curloc if it exists
Line 2141  if (location.href.indexOf('#curloc')==-1 Line 2155  if (location.href.indexOf('#curloc')==-1
     }      }
   
     if ($r) {      if ($r) {
           unless ($tools_printed) {
               if (($args->{'counter'}) || ($userCanSeeHidden) ||
                   (($args->{'caller'} eq 'navmapsdisplay') &&
                    ($env{'form.showOnlyHomework'} ||
                     $ENV{QUERY_STRING} =~ /^jumpToFirstHomework/))) {
                   $r->print($legend.$tools);
               }
               $legend = "";
               $tools = "";
               $tools_printed = 1;
           }
         $r->print($result);          $r->print($result);
         $result = "";          $result = "";
         $r->rflush();          $r->rflush();
     }      }
                   
     return $result;      return $legend.$tools.$result;
 }  }
   
 sub add_linkitem {  sub add_linkitem {
Line 5162  sub awarded { Line 5187  sub awarded {
     if (!defined($part)) { $part = '0'; }      if (!defined($part)) { $part = '0'; }
     return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.awarded'};      return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.awarded'};
 }  }
   sub latefrac {
       my $self = shift; my $part = shift;
       $self->{NAV_MAP}->get_user_data();
       if (!defined($part)) { $part = '0'; }
       return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.latefrac'};
   }
 sub taskversion {  sub taskversion {
     my $self = shift; my $part = shift;      my $self = shift; my $part = shift;
     $self->{NAV_MAP}->get_user_data();      $self->{NAV_MAP}->get_user_data();
Line 5251  sub opendate { Line 5282  sub opendate {
     }      }
     return $opendate;      return $opendate;
 }  }
   sub overduedate {
       my ($self,$part) = @_;
       my $duedate = $self->parmval("duedate", $part);
       my $overduedate;
       if ($duedate) {
           my $grace = $self->parmval("grace", $part);
           if ($grace) {
               my $grace_end = (split(/,/,$grace))[-1];
               my ($offset) = split(/:/,$grace_end,2);
               if ($offset > 0) {
                   $overduedate = $offset + $duedate;
               }
           }
       }
       return $overduedate;
   }
   sub partial_credit_overdue {
       my ($self,$part) = @_;
       my $reduction;
       my $duedate = $self->parmval("duedate", $part);
       if ($duedate) {
           my $grace = $self->parmval("grace",$part);
           if ($grace) {
               my $lateness = time - $duedate;
               if ($lateness > 0) {
                   my ($start,$end,$startfrac,$endfrac,$usegrad);
                   $start = 0;
                   $startfrac = 1.0;
                   $usegrad = 0;
                   foreach my $item (split(/,/,$grace)) {
                       my ($offset,$frac,$grad) = split(/:/,$item);
                       if ($lateness > $offset) {
                           $start = $offset;
                           $startfrac = $frac;
                           next;
                       } elsif ($lateness <= $offset) {
                           $end = $offset;
                           $endfrac = $frac;
                           $usegrad = $grad;
                           last;
                       }
                   }
                   if ($end) {
                       if (($end == $start) || ($startfrac == $endfrac)) {
                           $reduction = $endfrac;
                       } elsif ($end - $start > 0) {
                           if (($endfrac <= 1.0) && ($endfrac >= 0)) {
                               $reduction = $endfrac;
                               if ($usegrad) {
                                   my $decline = $startfrac - $endfrac;
                                   my $fraction = ($lateness - $start)/($end - $start);
                                   if (($fraction <= 1) && ($fraction >= 0)) {
                                       my $value = $startfrac - ($decline*$fraction);
                                       $reduction = sprintf("%.2f", $value);
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
       return $reduction;
   }
   
 sub problemstatus {  sub problemstatus {
     (my $self, my $part) = @_;      (my $self, my $part) = @_;
     my $problemstatus = $self->parmval("problemstatus", $part);      my $problemstatus = $self->parmval("problemstatus", $part);
Line 5829  sub getDateStatus { Line 5925  sub getDateStatus {
   
     my $open = $self->opendate($part);      my $open = $self->opendate($part);
     my $due = $self->duedate($part);      my $due = $self->duedate($part);
       my $overdue = $self->overduedate($part);
     my $answer = $self->answerdate($part);      my $answer = $self->answerdate($part);
   
     if (!$open && !$due && !$answer) {      if (!$open && !$due && !$answer) {
Line 5838  sub getDateStatus { Line 5935  sub getDateStatus {
     }      }
     if (!$open || $now < $open) {return $self->OPEN_LATER}      if (!$open || $now < $open) {return $self->OPEN_LATER}
     if (!$due || $now < $due) {return $self->OPEN}      if (!$due || $now < $due) {return $self->OPEN}
       if ($overdue && $now < $overdue) {return $self->OPEN}
     if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}      if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}
     if ($answer) { return $self->ANSWER_OPEN; }      if ($answer) { return $self->ANSWER_OPEN; }
     return PAST_DUE_NO_ANSWER;      return PAST_DUE_NO_ANSWER;
Line 6106  sub status { Line 6204  sub status {
     # If there's an answer date and we're past it, don't      # If there's an answer date and we're past it, don't
     # suppress the feedback; student should know      # suppress the feedback; student should know
     if ($self->duedate($part) && $self->duedate($part) < time() &&      if ($self->duedate($part) && $self->duedate($part) < time() &&
           (!$self->overduedate($part) || $self->overduedate($part) < time()) &&
  $self->answerdate($part) && $self->answerdate($part) < time()) {   $self->answerdate($part) && $self->answerdate($part) < time()) {
  $suppressFeedback = 0;   $suppressFeedback = 0;
     }      }

Removed from v.1.574  
changed lines
  Added in v.1.576


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