Diff for /loncom/interface/lonnavmaps.pm between versions 1.509.2.14.2.2 and 1.509.2.14.4.1

version 1.509.2.14.2.2, 2022/01/05 00:41:13 version 1.509.2.14.4.1, 2022/03/25 22:12:52
Line 945  sub render_resource { Line 945  sub render_resource {
     # links to open and close the folder      # links to open and close the folder
   
     my $whitespace = $location.'/whitespace_21.gif';      my $whitespace = $location.'/whitespace_21.gif';
     my ($nomodal,$linkopen,$linkclose);      my $linkopen = "<img src='$whitespace' alt='' />";
     unless ($resource->is_map() || $params->{'resource_nolink'}) {      my $nomodal;
         $linkopen = "<img src='$whitespace' alt='' />";      if (($params->{'modalLink'}) && (!$resource->is_sequence())) {
         $linkclose = "</a>";          if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) {
         if (($params->{'modalLink'}) && (!$resource->is_sequence())) {              my $exturl = $1;
             if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) {              if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {
                 my $exturl = $1;  
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {  
                     $nomodal = 1;  
                 }  
             } elsif (($link eq "/public/$LONCAPA::match_domain/$LONCAPA::match_courseid/syllabus") &&  
                      ($env{'request.course.id'}) && ($ENV{'SERVER_PORT'} == 443) &&  
                      ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                 $nomodal = 1;                  $nomodal = 1;
             }              }
             my $esclink = &js_escape($link);          } elsif (($link eq "/public/$LONCAPA::match_domain/$LONCAPA::match_courseid/syllabus") &&
             if ($nomodal) {                   ($env{'request.course.id'}) && ($ENV{'SERVER_PORT'} == 443) &&
                 $linkopen .= "<a href=\"#\" onclick=\"javascript:window.open('$esclink','resourcepreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1'); return false;\" />";                   ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
             } else {               $nomodal = 1;
                 $linkopen .= "<a href=\"$link\" onclick=\"javascript:openMyModal('$esclink',600,500,'yes','true'); return false;\">";          }
             }          my $esclink = &js_escape($link);
           if ($nomodal) {
               $linkopen .= "<a href=\"#\" onclick=\"javascript:window.open('$esclink','resourcepreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1'); return false;\" />";
         } else {          } else {
             $linkopen .= "<a href=\"$link\">";              $linkopen .= "<a href=\"$link\" onclick=\"javascript:openMyModal('$esclink',600,500,'yes','true'); return false;\">";
         }          }
       } else {
           $linkopen .= "<a href=\"$link\">";
     }      }
       my $linkclose = "</a>";
   
     # Default icon: unknown page      # Default icon: unknown page
     my $icon = "<img class=\"LC_contentImage\" src='$location/unknown.gif' alt='' />";      my $icon = "<img class=\"LC_contentImage\" src='$location/unknown.gif' alt='' />";
Line 1017  sub render_resource { Line 1015  sub render_resource {
                 '&amp;jump=' .                  '&amp;jump=' .
                 &escape($resource->symb()) .                   &escape($resource->symb()) . 
                 "&amp;folderManip=1\">";                  "&amp;folderManip=1\">";
             $linkclose = '</a>';  
         } else {          } else {
             # Don't allow users to manipulate folder              # Don't allow users to manipulate folder
             $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';              $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
             $icon = "<img class=\"LC_space\" src='$whitespace' alt='' />"."<img class=\"LC_contentImage\" src='$location/$icon' alt=\"".($nowOpen ? &mt('Open Folder') : &mt('Close Folder')).' '.$title."\" />";              $icon = "<img class=\"LC_space\" src='$whitespace' alt='' />"."<img class=\"LC_contentImage\" src='$location/$icon' alt=\"".($nowOpen ? &mt('Open Folder') : &mt('Close Folder')).' '.$title."\" />";
             if ($params->{'caller'} eq 'sequence') {              if ($params->{'caller'} eq 'sequence') {
                 $linkopen = "<a href=\"$link\">";                  $linkopen = "<a href=\"$link\">";
                 $linkclose = '</a>';  
             } else {              } else {
                 $linkopen = "";                  $linkopen = "";
                 $linkclose = "";                  $linkclose = "";
Line 1043  sub render_resource { Line 1040  sub render_resource {
         }          }
         if ($params->{'mapHidden'} || $resource->randomout()) {          if ($params->{'mapHidden'} || $resource->randomout()) {
             $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';              $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
         } elsif ($params->{'mapUnlisted'}) {  
             $nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> ';  
         } elsif ($params->{'mapHiddenDeepLink'} || $resource->deeplinkout()) {  
             $nonLinkedText .= ' <span class="LC_warning">('.&mt('not shown').')</span> ';  
         }          }
     } else {      } else {
         if ($resource->randomout()) {          if ($resource->randomout()) {
             $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';              $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
         } elsif ($resource->deeplinkout()) {  
             $nonLinkedText .= ' <span class="LC_warning">('.&mt('not shown').')</span> ';  
         } else {  
             my $deeplink = $resource->deeplink($params->{caller});  
             if ((($deeplink eq 'absent') || ($deeplink eq 'grades')) &&  
                   &advancedUser()) {  
                 $nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> ';  
             } elsif (($deeplink) && ($deeplink) ne 'full') {  
                 if (&advancedUser()) {  
                     $nonLinkedText .= ' <span class="LC_warning">('.&mt('deep-link access').  
                                       ')</span> ';  
                 } else {  
                     $nonLinkedText .= ' <span class="LC_warning">('.&mt('access via external site').  
                                       ')</span> ';  
                 }  
             }  
         }          }
     }      }
     if (!$resource->condval()) {      if (!$resource->condval()) {
Line 1391  sub render { Line 1368  sub render {
         # an infinite loop          # an infinite loop
         my $oldFilterFunc = $filterFunc;          my $oldFilterFunc = $filterFunc;
         $filterFunc = sub { my $res = shift; return !$res->randomout() &&           $filterFunc = sub { my $res = shift; return !$res->randomout() && 
                                 ($res->deeplink($args->{'caller'}) ne 'absent') &&  
                                 ($res->deeplink($args->{'caller'}) ne 'grades') &&  
                                 !$res->deeplinkout() &&  
                                 &$oldFilterFunc($res);};                                  &$oldFilterFunc($res);};
     }      }
   
Line 1814  END Line 1788  END
   
         # If this is an empty sequence and we're filtering them, continue on          # If this is an empty sequence and we're filtering them, continue on
         $args->{'mapHidden'} = 0;          $args->{'mapHidden'} = 0;
         $args->{'mapUnlisted'} = 0;  
         $args->{'mapHiddenDeepLink'} = 0;  
         if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) {          if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) {
             if ($args->{'suppressEmptySequences'}) {              if ($args->{'suppressEmptySequences'}) {
                 next;                  next;
Line 1828  END Line 1800  END
                     } else {                      } else {
                         next;                          next;
                     }                      }
                 } elsif ($curRes->deeplinkout) {  
                     if ($userCanSeeHidden) {  
                         $args->{'mapHiddenDeepLink'} = 1;  
                     } else {  
                         next;  
                     }  
                 } else {  
                     my $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink");  
                     my ($state,$others,$listed) = split(/,/,$deeplink);  
                     if (($listed eq 'absent') || ($listed eq 'grades')) {  
                         if ($userCanSeeHidden) {  
                             $args->{'mapUnlisted'} = 1;  
                         } else {  
                             next;  
                         }  
                     }  
                 }                  }
             }              }
         }          }
Line 1906  END Line 1862  END
     $args->{'condensed'} = 1;      $args->{'condensed'} = 1;
  }   }
             }              }
         }          } 
         # If deep-link parameter is set (and is not set to full) suppress link  
         # unless privileged user, tinyurl used for login resolved to a map, and  
         # the resource is within the map.  
         if ((!$curRes->deeplink($args->{'caller'})) ||  
             ($curRes->deeplink($args->{'caller'}) eq 'full') || &advancedUser()) {  
             $args->{'resource_nolink'} = 0;  
         } else {  
             $args->{'resource_nolink'} = 1;  
         }  
                           
         # If the multipart problem was condensed, "forget" it was multipart          # If the multipart problem was condensed, "forget" it was multipart
         if (scalar(@parts) == 1) {          if (scalar(@parts) == 1) {
Line 2481  sub getIterator { Line 2428  sub getIterator {
     my $self = shift;      my $self = shift;
     my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift,      my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift,
                                                      shift, undef, shift,                                                       shift, undef, shift,
      shift, shift, shift);       shift, shift);
     return $iterator;      return $iterator;
 }  }
   
Line 3447  getIterator behaves as follows: Line 3394  getIterator behaves as follows:
   
 =over 4  =over 4
   
 =item * B<getIterator>(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap, $deeplinklisted):  =item * B<getIterator>(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap):
   
 All parameters are optional. firstResource is a resource reference  All parameters are optional. firstResource is a resource reference
 corresponding to where the iterator should start. It defaults to  corresponding to where the iterator should start. It defaults to
Line 3464  that is not just a single, 'redirecting' Line 3411  that is not just a single, 'redirecting'
 will return all information, starting with the top-level map,  will return all information, starting with the top-level map,
 regardless of content. returnTopMap, if true (default false), will  regardless of content. returnTopMap, if true (default false), will
 cause the iterator to return the top-level map object (resource 0.0)  cause the iterator to return the top-level map object (resource 0.0)
 before anything else. deeplinklisted if true (default false), will  before anything else.
 check "listed" status of a resource with a deeplink, and unless "absent"  
 will exclude deeplink checking when retrieving the browsePriv from  
 lonnet::allowed().  
   
 Thus, by default, only top-level resources will be shown. Change the  Thus, by default, only top-level resources will be shown. Change the
 condition to a 1 without changing the hash, and all resources will be  condition to a 1 without changing the hash, and all resources will be
Line 3604  sub new { Line 3548  sub new {
     # have we done that yet?      # have we done that yet?
     $self->{HAVE_RETURNED_0} = 0;      $self->{HAVE_RETURNED_0} = 0;
   
     # Do we want to check the "listed" status for a resource for which  
     # deeplinking applies.  
     $self->{DEEPLINKLISTED} = shift;  
   
     # Now, we need to pre-process the map, by walking forward and backward      # Now, we need to pre-process the map, by walking forward and backward
     # over the parts of the map we're going to look at.      # over the parts of the map we're going to look at.
   
Line 3699  sub new { Line 3639  sub new {
  $finishResource, $self->{FILTER},   $finishResource, $self->{FILTER},
  $self->{ALREADY_SEEN},    $self->{ALREADY_SEEN}, 
  $self->{CONDITION},   $self->{CONDITION},
  $self->{FORCE_TOP},   $self->{FORCE_TOP});
                                                  undef,$self->{DEEPLINKLISTED});  
     }      }
   
     # Set up some bookkeeping information.      # Set up some bookkeeping information.
Line 3870  sub next { Line 3809  sub next {
                                               $finishResource, $self->{FILTER},                                                $finishResource, $self->{FILTER},
                                               $self->{ALREADY_SEEN},                                                $self->{ALREADY_SEEN},
       $self->{CONDITION},        $self->{CONDITION},
       $self->{FORCE_TOP},        $self->{FORCE_TOP});
                                               undef,$self->{DEEPLINKLISTED});  
     }      }
   
     # If this is a blank resource, don't actually return it.      # If this is a blank resource, don't actually return it.
     # Should you ever find you need it, make sure to add an option to the code      # Should you ever find you need it, make sure to add an option to the code
     #  that you can use; other things depend on this behavior.      #  that you can use; other things depend on this behavior.
     my $browsePriv = $self->{HERE}->browsePriv($noblockcheck,$self->{DEEPLINKLISTED});      my $browsePriv = $self->{HERE}->browsePriv($noblockcheck);
     if (!$self->{HERE}->src() ||       if (!$self->{HERE}->src() || 
         (!($browsePriv eq 'F') && !($browsePriv eq '2')) ) {          (!($browsePriv eq 'F') && !($browsePriv eq '2')) ) {
         return $self->next($closeAllPages);          return $self->next($closeAllPages);
Line 4305  sub from { my $self=shift; return $self- Line 4243  sub from { my $self=shift; return $self-
 sub goesto { my $self=shift; return $self->navHash("goesto_", 1); }  sub goesto { my $self=shift; return $self->navHash("goesto_", 1); }
 sub kind { my $self=shift; return $self->navHash("kind_", 1); }  sub kind { my $self=shift; return $self->navHash("kind_", 1); }
 sub randomout { my $self=shift; return $self->navHash("randomout_", 1); }  sub randomout { my $self=shift; return $self->navHash("randomout_", 1); }
 sub deeplinkout { my $self=shift; return $self->navHash("deeplinkout_", 1); }  
 sub randompick {   sub randompick { 
     my $self = shift;      my $self = shift;
     my $randompick = $self->parmval('randompick');      my $randompick = $self->parmval('randompick');
Line 4561  sub is_task { Line 4498  sub is_task {
   
 sub is_empty_sequence {  sub is_empty_sequence {
     my $self=shift;      my $self=shift;
       my $src = $self->src();
     return !$self->is_page() && $self->navHash("is_map_", 1) && !$self->navHash("map_type_" . $self->map_pc());      return !$self->is_page() && $self->navHash("is_map_", 1) && !$self->navHash("map_type_" . $self->map_pc());
 }  }
   
Line 4881  sub duedate { Line 4819  sub duedate {
     my $date;      my $date;
     my @interval=$self->parmval("interval", $part);      my @interval=$self->parmval("interval", $part);
     my $due_date=$self->parmval("duedate", $part);      my $due_date=$self->parmval("duedate", $part);
     if ($interval[0] =~ /(\d+)/) {      if ($interval[0] =~ /^(\d+)/) {
         my $timelimit = $1;          my $timelimit = $1;
         my $first_access=&Apache::lonnet::get_first_access($interval[1],          my $first_access=&Apache::lonnet::get_first_access($interval[1],
                                                           $self->{SYMB});                                                             $self->{SYMB});
  if (defined($first_access)) {   if (defined($first_access)) {
             my $interval = $first_access+$timelimit;              my $interval = $first_access+$timelimit;
     $date = (!$due_date || $interval < $due_date) ? $interval       $date = (!$due_date || $interval < $due_date) ? $interval 
Line 4980  sub slot_control { Line 4918  sub slot_control {
     my $available = $self->parmval("available", $part);       my $available = $self->parmval("available", $part); 
     return ($useslots,$availablestudent,$available);      return ($useslots,$availablestudent,$available);
 }  }
 sub deeplink {  
     my ($self,$caller,$action) = @_;  
     my $deeplink = $self->parmval("deeplink");  
     if ($deeplink) {  
         my ($state,$others,$listed,$scope) = split(/,/,$deeplink);  
         if ($action eq 'getlisted') {  
             return $listed;  
         }  
         if ($env{'request.deeplink.login'}) {  
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
             my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);  
             if ($deeplink_symb) {  
                 my ($loginmap,$mapname);  
                 if ($deeplink_symb =~ /\.(page|sequence)$/) {  
                     $mapname = $self->enclosing_map_src();  
                     $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[2]);  
                     return if ($mapname eq $loginmap);  
                 } else {  
                     return if ($deeplink_symb eq $self->symb());  
                     if (($scope eq 'map') || ($scope eq 'rec')) {  
                         $mapname = $self->enclosing_map_src();  
                         $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[0]);  
                         return if ($mapname eq $loginmap);  
                     }  
                 }  
                 if ($scope eq 'rec') {  
                     my $map_pc = $self->navHash('map_pc_'.$mapname);  
                     my @recurseup = split(/,/,$self->navHash('map_hierarchy_'.$map_pc));  
                     my $login_pc = $self->navHash('map_pc_'.$loginmap);  
                     return if (grep(/^\Q$login_pc\E$/,@recurseup));  
                 }  
             }  
         }  
         unless (($caller eq 'sequence') || ($state eq 'both')) {  
             return $listed;  
         }  
     }  
     return;  
 }  
   
 # Multiple things need this  # Multiple things need this
 sub getReturnHash {  sub getReturnHash {
Line 6151  sub getPrevious { Line 6049  sub getPrevious {
 sub browsePriv {  sub browsePriv {
     my $self = shift;      my $self = shift;
     my $noblockcheck = shift;      my $noblockcheck = shift;
     my $deeplinklisted = shift;  
     if (defined($self->{BROWSE_PRIV})) {      if (defined($self->{BROWSE_PRIV})) {
         return $self->{BROWSE_PRIV};          return $self->{BROWSE_PRIV};
     }      }
     my ($nodeeplinkcheck,$nodeeplinkout);  
     if ($deeplinklisted) {  
         my $deeplink = $self->deeplink(undef,'getlisted');  
         if (($deeplink) && ($deeplink ne 'absent')) {  
             $nodeeplinkcheck = 1;  
         }  
         $nodeeplinkout = 1;  
     }  
     $self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(),      $self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(),
     $self->{SYMB},undef,      $self->{SYMB},undef,
                                                     undef,$noblockcheck,                                                      undef,$noblockcheck);
                                                     undef,$nodeeplinkcheck,  
                                                     $nodeeplinkout);  
 }  }
   
 =pod  =pod

Removed from v.1.509.2.14.2.2  
changed lines
  Added in v.1.509.2.14.4.1


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