--- rat/lonsequence.pm 2012/12/16 17:48:39 1.42 +++ rat/lonsequence.pm 2020/09/03 12:14:30 1.52 @@ -2,7 +2,7 @@ # # Sequence Handler # -# $Id: lonsequence.pm,v 1.42 2012/12/16 17:48:39 raeburn Exp $ +# $Id: lonsequence.pm,v 1.52 2020/09/03 12:14:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,11 +36,14 @@ use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); use GDBM_File; use LONCAPA::map(); +use LONCAPA::ltiutils; use LONCAPA; use Apache::lonpageflip(); use Apache::loncommon(); use Apache::groupsort(); use Apache::lonlocal; +use Apache::lonnavmaps(); +use Apache::lonenc(); use HTML::Entities(); my %selhash; @@ -133,13 +136,13 @@ ENDSELECT .'


'); } my $idx=0; - foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { - if (defined($_)) { + foreach my $entry (&attemptread(&Apache::lonnet::filelocation('',$url))) { + if (defined($entry)) { $idx++; if ($successtied) { $r->print('
'); } - my ($title,$url)=split(/\:/,$_); + my ($title,$url)=split(/\:/,$entry); $title = &LONCAPA::map::qtescape($title); unless ($title) { $title=(split(/\//,$url))[-1] }; my $enc_title = &HTML::Entities::encode($title,'\'"<>&'); @@ -184,12 +187,12 @@ ENDCHECKBOX # ----------------------------------------------------------- Clean out selhash sub start_fresh_session { - foreach (keys %selhash) { - if ($_ =~ /^pre_/) { - delete $selhash{$_}; + foreach my $item (keys(%selhash)) { + if ($item =~ /^pre_/) { + delete $selhash{$item}; } - if ($_ =~ /^store/) { - delete $selhash{$_}; + if ($item =~ /^store/) { + delete $selhash{$item}; } } } @@ -205,13 +208,135 @@ sub handler { $r->send_http_header; return OK; } - + + my $requrl=$r->uri; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['forceselect','launch']); + ['forceselect','launch','navmap']); + + if (($env{'request.course.fn'}) && ($env{'form.navmap'}) && ($env{'request.course.id'})) { + my $crstype = &Apache::loncommon::course_type(); + unless (($crstype eq 'Placement') && (!$env{'request.role.adv'})) { + + # Check for critical messages and redirect if present. + my ($redirect,$url) = &Apache::loncommon::critical_redirect(300,'contents'); + if ($redirect) { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $url); + return REDIRECT; + } + + # Check if course needs to be re-initialized + my $loncaparev = $r->dir_config('lonVersion'); + my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); + + if ($result eq 'switch') { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + $r->print(&Apache::loncommon::check_release_result(@reinit)); + return OK; + } elsif ($result eq 'update') { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); + if ($ferr) { + my $requrl = $r->uri; + $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; + $env{'user.reinit'} = 1; + return HTTP_NOT_ACCEPTABLE; + } + } + + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + + my $mapurl = &Apache::lonnet::declutter($requrl); + my $maptitle = &Apache::lonnet::gettitle($mapurl); + my @crumbs = ({text => $maptitle, no_mt => 1}); + my $args = {'bread_crumbs' => \@crumbs, + 'bread_crumbs_nomenu' => 1}; + + # Create the nav map + my $navmap = Apache::lonnavmaps::navmap->new(); + + if (ref($navmap)) { + # renderer call + if (&Apache::lonnet::is_on_map($requrl)) { + my ($ltiscope,$ltiuri); + if (($env{'request.lti.login'}) && ($env{'request.lti.uri'})) { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + } + @crumbs = (); + unless ($ltiscope eq 'resource') { + unless ($ltiscope eq 'map') { + @crumbs = ({text => $crstype.' Contents', + href => "javascript:gopost('/adm/navmaps','')"}); + } + my $res = $navmap->getResourceByUrl($mapurl); + if (ref($res)) { + my $symb = $res->symb(); + if ($symb) { + my ($parent) = &Apache::lonnet::decode_symb($res->symb()); + if (($parent ne $env{'course.'.$env{'request.course.id'}.'.url'}) && + !(($ltiscope eq 'map') && ($requrl eq $ltiuri))) { + my @mapcrumbs = $navmap->recursed_crumbs($parent); + if (@mapcrumbs) { + push(@crumbs,@mapcrumbs); + } + } + $env{'request.symb'} = $symb; + } + } + } + push(@crumbs,{text => $maptitle, no_mt => 1}); + $args = {'bread_crumbs' => \@crumbs, + 'bread_crumbs_nomenu' => 1}; + $r->print(&Apache::loncommon::start_page($maptitle,undef,$args)); + + my $renderArgs = { 'cols' => [0,1,2,3], + 'url' => $mapurl, + 'navmap' => $navmap, + 'suppressNavmap' => 1, + 'suppressEmptySequences' => 1, + 'filterFunc' => undef, + 'resource_no_folder_link' => 1, + 'r' => $r, + 'caller' => 'sequence', + 'notools' => 1, + 'iterator_map' => $mapurl, + }; + + my $render = &Apache::lonnavmaps::render($renderArgs); + + # If no resources were found let the user know. + if ($renderArgs->{'counter'} == 0) { + $r->print('

'. + &mt('No items found in folder'). + '

'); + } + $r->print(&Apache::loncommon::end_page()); + } else { + $r->print(&Apache::loncommon::start_page($maptitle,undef,$args). + '

'. + &mt('Folder no longer appears to be a part of the course'). + '

'. + &Apache::loncommon::end_page()); + } + } else { + $r->print(&Apache::loncommon::start_page($maptitle,undef,$args). + '

'. + &mt('Error: could not determine contents of folder'). + '

'. + &Apache::loncommon::end_page()); + } + $r->rflush(); + return OK; + } + } my %hash; my %bighash; - my $requrl=$r->uri; $successtied=0; # ------------------------------------------------------------ Tie symb db file @@ -292,8 +417,12 @@ sub handler { if ($is_encrypted) { $showdisurl = &Apache::lonenc::encrypted($disurl); } - &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid], - 'last_known' => [$disurl,$dismapid]); + if ($disurl =~ m{/adm/navmaps(\?|$)}) { + &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid]); + } else { + &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid], + 'last_known' => [$disurl,$dismapid]); + } &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => &Apache::lonnet::absolute_url($ENV{'SERVER_NAME'}). $showdisurl); @@ -305,15 +434,18 @@ sub handler { my %lt =&Apache::lonlocal::texthash( 'nere' => 'Next resource could not be displayed', 'goba' => 'Go Back', - 'nacc' => 'Navigate Course Content', + 'nacc' => 'Course Contents', ); + if (&Apache::loncommon::course_type() eq 'Community') { + $lt{'nav'} = &mt('Community Contents'); + } my $warnmsg; if ($arrow_dir eq 'forward') { $warnmsg = &mt('As all folders and sequences ' .'following the current resource were empty, ' .'you have now reached the end of the course.'); } elsif ($arrow_dir eq 'back') { - $warnmsg = &mt('As all folders and sequences '. + $warnmsg = &mt('As all folders and sequences ' .'preceding the current resource were empty, ' .'you have now reached the beginning of the course.'); }