--- loncom/interface/lonnavmaps.pm 2021/12/31 23:14:04 1.509.2.14 +++ loncom/interface/lonnavmaps.pm 2023/01/18 00:53:39 1.509.2.14.2.5 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.509.2.14 2021/12/31 23:14:04 raeburn Exp $ +# $Id: lonnavmaps.pm,v 1.509.2.14.2.5 2023/01/18 00:53:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -945,29 +945,31 @@ sub render_resource { # links to open and close the folder my $whitespace = $location.'/whitespace_21.gif'; - my $linkopen = ""; - my $nomodal; - if (($params->{'modalLink'}) && (!$resource->is_sequence())) { - if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) { - my $exturl = $1; - if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) { + my ($nomodal,$linkopen,$linkclose); + unless ($resource->is_map() || $params->{'resource_nolink'}) { + $linkopen = ""; + $linkclose = ""; + if (($params->{'modalLink'}) && (!$resource->is_sequence())) { + if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) { + 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; } - } 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; - } - my $esclink = &js_escape($link); - if ($nomodal) { - $linkopen .= ""; + my $esclink = &js_escape($link); + if ($nomodal) { + $linkopen .= ""; + } else { + $linkopen .= ""; + } } else { - $linkopen .= ""; + $linkopen .= ""; } - } else { - $linkopen .= ""; } - my $linkclose = ""; # Default icon: unknown page my $icon = ""; @@ -995,8 +997,12 @@ sub render_resource { if ($it->{CONDITION}) { $nowOpen = !$nowOpen; } - - my $folderType = $resource->is_sequence() ? 'folder' : 'page'; + my $folderType; + if (&advancedUser() && $resource->is_missing_map()) { + $folderType = 'none'; + } else { + $folderType = $resource->is_sequence() ? 'folder' : 'page'; + } my $title=$resource->title; $title=~s/\"/\&qout;/g; if (!$params->{'resource_no_folder_link'}) { @@ -1015,13 +1021,14 @@ sub render_resource { '&jump=' . &escape($resource->symb()) . "&folderManip=1\">"; - + $linkclose = ''; } else { # Don't allow users to manipulate folder $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif'; $icon = ""."\"".($nowOpen"; if ($params->{'caller'} eq 'sequence') { $linkopen = ""; + $linkclose = ''; } else { $linkopen = ""; $linkclose = ""; @@ -1040,10 +1047,30 @@ sub render_resource { } if ($params->{'mapHidden'} || $resource->randomout()) { $nonLinkedText .= ' ('.&mt('hidden').') '; + } elsif ($params->{'mapUnlisted'}) { + $nonLinkedText .= ' ('.&mt('unlisted').') '; + } elsif ($params->{'mapHiddenDeepLink'} || $resource->deeplinkout()) { + $nonLinkedText .= ' ('.&mt('not shown').') '; } } else { if ($resource->randomout()) { $nonLinkedText .= ' ('.&mt('hidden').') '; + } elsif ($resource->deeplinkout()) { + $nonLinkedText .= ' ('.&mt('not shown').') '; + } else { + my $deeplink = $resource->deeplink($params->{caller}); + if ((($deeplink eq 'absent') || ($deeplink eq 'grades')) && + &advancedUser()) { + $nonLinkedText .= ' ('.&mt('unlisted').') '; + } elsif (($deeplink) && ($deeplink) ne 'full') { + if (&advancedUser()) { + $nonLinkedText .= ' ('.&mt('deep-link access'). + ') '; + } else { + $nonLinkedText .= ' ('.&mt('access via external site'). + ') '; + } + } } } if (!$resource->condval()) { @@ -1368,15 +1395,49 @@ sub render { # an infinite loop my $oldFilterFunc = $filterFunc; $filterFunc = sub { my $res = shift; return !$res->randomout() && + ($res->deeplink($args->{'caller'}) ne 'absent') && + ($res->deeplink($args->{'caller'}) ne 'grades') && + !$res->deeplinkout() && &$oldFilterFunc($res);}; } my $condition = 0; if ($env{'form.condition'}) { $condition = 1; + } elsif (($env{'request.deeplink.login'}) && ($env{'request.course.id'}) && (!$userCanSeeHidden)) { + if (!defined($navmap)) { + $navmap = Apache::lonnavmaps::navmap->new(); + } + if (defined($navmap)) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $symb = &Apache::loncommon::symb_from_tinyurl($env{'request.deeplink.login'},$cnum,$cdom); + if ($symb) { + my $deeplink; + my $res = $navmap->getBySymb($symb); + if ($res->is_map()) { + my $mapname = &Apache::lonnet::declutter($res->src()); + $mapname = &Apache::lonnet::deversion($mapname); + $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink"); + } else { + $deeplink = $res->deeplink(); + } + if ($deeplink ne '') { + if ((split(/,/,$deeplink))[1] eq 'hide') { + if ($res->is_map()) { + map { $filterHash->{$_} = 1 if $_ } split(/,/,$res->map_hierarchy()); + } else { + my $mapurl = (&Apache::lonnet::decode_symb($symb))[0]; + my $map = $navmap->getResourceByUrl($mapurl); + map { $filterHash->{$_} = 1 if $_ } split(/,/,$map->map_hierarchy()); + } + } + } + } + } } - if (!$env{'form.folderManip'} && !defined($args->{'iterator'})) { + if (!$env{'form.folderManip'} && !defined($args->{'iterator'}) && !$args->{'nocurrloc'}) { # Step 1: Check to see if we have a navmap if (!defined($navmap)) { $navmap = Apache::lonnavmaps::navmap->new(); @@ -1585,16 +1646,22 @@ END } $result.=''; } - if (($args->{'caller'} eq 'navmapsdisplay') && - ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('cev',$env{'request.course.id'})))) { + if (($args->{'caller'} eq 'navmapsdisplay') && ($env{'request.course.id'})) { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq "uploaded/$cdom/$cnum/default.sequence") { - &add_linkitem($args->{'linkitems'},'edittoplevel', - "javascript:gocmd('/adm/coursedocs','editdocs');", - 'Content Editor'); + if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) || + (&Apache::lonnet::allowed('cev',$env{'request.course.id'}))) { + &add_linkitem($args->{'linkitems'},'edittoplevel', + "javascript:gocmd('/adm/coursedocs','editdocs');", + 'Content Editor'); + } + if ($counter) { + &add_linkitem($args->{'linkitems'},'printout', + "javascript:gopost('/adm/printout','/adm/navmaps');", + 'Prepare a printable document'); + } } } @@ -1788,6 +1855,8 @@ END # If this is an empty sequence and we're filtering them, continue on $args->{'mapHidden'} = 0; + $args->{'mapUnlisted'} = 0; + $args->{'mapHiddenDeepLink'} = 0; if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) { if ($args->{'suppressEmptySequences'}) { next; @@ -1800,6 +1869,22 @@ END } else { 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; + } + } } } } @@ -1862,7 +1947,16 @@ END $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 (scalar(@parts) == 1) { @@ -2015,7 +2109,7 @@ sub show_linkitems_toolbar { $result .= ''."\n". '