--- loncom/interface/lonnavmaps.pm 2017/09/15 23:17:24 1.509.2.5.4.2
+++ loncom/interface/lonnavmaps.pm 2018/09/04 19:48:58 1.509.2.7
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.509.2.5.4.2 2017/09/15 23:17:24 raeburn Exp $
+# $Id: lonnavmaps.pm,v 1.509.2.7 2018/09/04 19:48:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
@@ -486,7 +486,7 @@ use Apache::lonlocal;
use Apache::lonnet;
use Apache::lonmap;
-use POSIX qw (ceil floor strftime);
+use POSIX qw (floor strftime);
use Time::HiRes qw( gettimeofday tv_interval );
use LONCAPA;
use DateTime();
@@ -643,6 +643,9 @@ sub getDescription {
} elsif ($slot_status == $res->RESERVABLE) {
$slotmsg = &mt('Reservable, reservations close [_1]',
timeToHumanString($slot_time,'end'));
+ } elsif ($slot_status == $res->NEEDS_CHECKIN) {
+ $slotmsg = &mt('Reserved, check-in needed - ends [_1]',
+ timeToHumanString($slot_time,'end'));
} elsif ($slot_status == $res->RESERVABLE_LATER) {
$slotmsg = &mt('Reservable, reservations open [_1]',
timeToHumanString($slot_time,'start'));
@@ -938,7 +941,28 @@ sub render_resource {
# links to open and close the folder
my $whitespace = $location.'/whitespace_21.gif';
- my $linkopen = "
"."";
+ 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:/)) {
+ $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 .= "";
+ } else {
+ $linkopen .= "";
+ }
+ } else {
+ $linkopen .= "";
+ }
my $linkclose = "";
# Default icon: unknown page
@@ -992,12 +1016,9 @@ sub render_resource {
# Don't allow users to manipulate folder
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
$icon = "
"."
";
- if ($params->{'caller'} eq 'sequence') {
- $linkopen = "";
- } else {
- $linkopen = "";
- $linkclose = "";
- }
+
+ $linkopen = "";
+ $linkclose = "";
}
if (((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) ||
(&Apache::lonnet::allowed('cev',$env{'request.course.id'}))) &&
@@ -1066,10 +1087,19 @@ sub render_resource {
}
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {
- $result .= "$curMarkerBegin$title$partLabel$curMarkerEnd$editmapLink$nonLinkedText";
- } else {
- $result .= "$curMarkerBegin$linkopen$title$partLabel$curMarkerEnd$editmapLink$nonLinkedText";
+ $linkclose = '';
+ if ($params->{'modalLink'}) {
+ my $esclink = &js_escape($link);
+ if ($nomodal) {
+ $linkopen = "";
+ } else {
+ $linkopen = "";
+ }
+ } else {
+ $linkopen = "";
+ }
}
+ $result .= "$curMarkerBegin$linkopen$title$partLabel$linkclose$curMarkerEnd$editmapLink$nonLinkedText";
return $result;
}
@@ -1360,11 +1390,10 @@ sub render {
my $currenturl = $env{'form.postdata'};
#$currenturl=~s/^http\:\/\///;
#$currenturl=~s/^[^\/]+//;
- unless ($args->{'caller'} eq 'sequence') {
- $here = $jump = &Apache::lonnet::symbread($currenturl);
- }
+
+ $here = $jump = &Apache::lonnet::symbread($currenturl);
}
- if (($here eq '') && ($args->{'caller'} ne 'sequence')) {
+ if ($here eq '') {
my $last;
if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
&GDBM_READER(),0640)) {
@@ -1691,6 +1720,11 @@ END
}
+ my $inhibitmenu;
+ if ($args->{'modalLink'}) {
+ $inhibitmenu = '&inhibitmenu=yes';
+ }
+
while (1) {
if ($args->{'sort'}) {
$curRes = shift(@resources);
@@ -1823,15 +1857,11 @@ END
$stack=$it->getStack();
}
($src,$symb,$anchor)=getLinkForResource($stack);
- my $srcHasQuestion = $src =~ /\?/;
if (defined($anchor)) { $anchor='#'.$anchor; }
- if (($args->{'caller'} eq 'sequence') && ($curRes->is_map())) {
- $args->{"resourceLink"} = $src.($srcHasQuestion?'&':'?') .'navmap=1';
- } else {
- $args->{"resourceLink"} = $src.
- ($srcHasQuestion?'&':'?') .
- 'symb=' . &escape($symb).$anchor;
- }
+ my $srcHasQuestion = $src =~ /\?/;
+ $args->{"resourceLink"} = $src.
+ ($srcHasQuestion?'&':'?') .
+ 'symb=' . &escape($symb).$inhibitmenu.$anchor;
}
# Now, we've decided what parts to show. Loop through them and
# show them.
@@ -2245,7 +2275,7 @@ sub generate_email_discuss_status {
foreach my $msgid (@keys) {
if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) {
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,
- $symb,$error) = &Apache::lonmsg::unpackmsgid(&LONCAPA::escape($msgid));
+ $symb,$error) = &Apache::lonmsg::unpackmsgid($msgid);
&Apache::lonenc::check_decrypt(\$symb);
if (($fromcid ne '') && ($fromcid ne $cid)) {
next;
@@ -2759,91 +2789,6 @@ sub recurseup_maps {
return @recurseup;
}
-sub recursed_crumbs {
- my ($self,$mapurl,$restitle) = @_;
- my (@revmapinfo,@revmapres);
- my $mapres = $self->getResourceByUrl($mapurl);
- if (ref($mapres)) {
- @revmapres = map { $self->getByMapPc($_); } split(/,/,$mapres->map_breadcrumbs());
- shift(@revmapres);
- }
- my $allowedlength = 60;
- my $minlength = 5;
- my $allowedtitle = 30;
- if (($env{'environment.icons'} eq 'iconsonly') && (!$env{'browser.mobile'})) {
- $allowedlength = 100;
- $allowedtitle = 70;
- }
- if (length($restitle) > $allowedtitle) {
- $restitle = &truncate_crumb_text($restitle,$allowedtitle);
- }
- my $totallength = length($restitle);
- my @links;
-
- foreach my $map (@revmapres) {
- my $pc = $map->map_pc();
- next if ((!$pc) || ($pc == 1));
- push(@links,$map);
- push(@revmapinfo,{'href' => $map->link().'?navmap=1','text' => $map->title(),'no_mt' => 1,});
- $totallength += length($map->title());
- }
- my $numlinks = scalar(@links);
- if ($numlinks) {
- if ($totallength - $allowedlength > 0) {
- my $available = $allowedlength - length($restitle);
- my $avg = POSIX::ceil($available/$numlinks);
- if ($avg < $minlength) {
- $avg = $minlength;
- }
- @revmapinfo = ();
- foreach my $map (@links) {
- my $showntitle = &truncate_crumb_text($map->title(),$avg);
- if ($showntitle ne '') {
- push(@revmapinfo,{'href' => $map->link().'?navmap=1','text' => $showntitle,'no_mt' => 1,});
- }
- }
- }
- }
- if ($restitle ne '') {
- push(@revmapinfo,{'text' => $restitle, 'no_mt' => 1});
- }
- return @revmapinfo;
-}
-
-sub truncate_crumb_text {
- my ($title,$limit) = @_;
- my $showntitle = '';
- if (length($title) > $limit) {
- my @words = split(/\b\s*/,$title);
- if (@words == 1) {
- $showntitle = substr($title,0,$limit).' ...';
- } else {
- my $linklength = 0;
- my $num = 0;
- foreach my $word (@words) {
- $linklength += 1+length($word);
- if ($word eq '-') {
- $showntitle =~ s/ $//;
- $showntitle .= $word;
- } elsif ($linklength > $limit) {
- if ($num < @words) {
- $showntitle .= $word.' ...';
- last;
- } else {
- $showntitle .= $word;
- }
- } else {
- $showntitle .= $word.' ';
- }
- }
- $showntitle =~ s/ $//;
- }
- return $showntitle;
- } else {
- return $title;
- }
-}
-
#
# Determines the open/close dates for printing a map that
# encloses a resource.
@@ -4466,12 +4411,6 @@ Returns a string with a comma-separated
for the hierarchy of maps containing a map, with the top level
map first, then descending to deeper levels, with the enclosing map last.
-=item * B:
-
-Same as map_hierarchy, except maps containing only a single itemm if
-it's a map, or containing no items are omitted, unless it's the top
-level map (map_pc = 1), which is always included.
-
=back
=cut
@@ -4507,11 +4446,6 @@ sub map_hierarchy {
my $pc = $self->map_pc();
return $self->navHash("map_hierarchy_$pc", 0);
}
-sub map_breadcrumbs {
- my $self = shift;
- my $pc = $self->map_pc();
- return $self->navHash("map_breadcrumbs_$pc", 0);
-}
#####
# Property queries
@@ -4736,12 +4670,11 @@ sub duedate {
my $date;
my @interval=$self->parmval("interval", $part);
my $due_date=$self->parmval("duedate", $part);
- if ($interval[0] =~ /^(\d+)/) {
- my $timelimit = $1;
- my $first_access=&Apache::lonnet::get_first_access($interval[1],
+ if ($interval[0] =~ /\d+/) {
+ my $first_access=&Apache::lonnet::get_first_access($interval[1],
$self->{SYMB});
if (defined($first_access)) {
- my $interval = $first_access+$timelimit;
+ my $interval = $first_access+$interval[0];
$date = (!$due_date || $interval < $due_date) ? $interval
: $due_date;
} else {
@@ -5647,7 +5580,7 @@ sub check_for_slot {
($checkedin,$checkedinslot) = $self->checkedin();
unless ((grep(/^\Q$checkedin\E/,@proctors)) &&
($checkedinslot eq $slot_name)) {
- return (NEEDS_CHECKIN,undef,$slot_name);
+ return (NEEDS_CHECKIN,$end,$slot_name);
}
}
return (RESERVED,$end,$slot_name);