--- rat/lonwrapper.pm 2020/02/29 16:05:26 1.76 +++ rat/lonwrapper.pm 2022/10/29 18:52:58 1.81 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Wrapper for external and binary files as standalone resources # -# $Id: lonwrapper.pm,v 1.76 2020/02/29 16:05:26 raeburn Exp $ +# $Id: lonwrapper.pm,v 1.81 2022/10/29 18:52:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,13 +39,15 @@ use Apache::lonhtmlcommon(); use Apache::lonextresedit(); use Apache::lonexttool(); use Apache::lonhomework(); +use Apache::lonnavmaps(); use LONCAPA qw(:DEFAULT :match); use HTML::Entities(); +use Digest::MD5(); # ================================================================ Main Handler sub wrapper { my ($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation, - $title,$width,$height) = @_; + $title,$width,$height,$reuse,$is_supp) = @_; my $forcereg; unless ($env{'form.folderpath'}) { @@ -56,6 +58,9 @@ sub wrapper { 'show' => 'Show content in pop-up window', ); + (undef,undef,undef,undef,undef,undef,my $clientmobile) = + &Apache::loncommon::decode_user_agent($r); + my ($anchor,$uselink); if ($is_ext) { if ($env{'form.symb'}) { @@ -66,7 +71,10 @@ sub wrapper { } elsif ($env{'form.anchor'} ne '') { $anchor = '#'.$env{'form.anchor'}; } - unless (($is_pdf) && ($env{'browser.mobile'})) { + if (($is_ext eq 'tab') || ($is_ext eq 'window')) { + $uselink = 1; + } + unless (($is_pdf && $clientmobile) || $uselink) { my $hostname = $r->hostname(); my $lonhost = $r->dir_config('lonHostID'); my $ip = &Apache::lonnet::get_host_ip($lonhost); @@ -142,7 +150,7 @@ sub wrapper { # do not obscure the Functions menu. # - unless (($env{'browser.mobile'}) || ($exttool eq 'window') || ($exttool eq 'tab') || $uselink) { + unless ($clientmobile || ($exttool eq 'window') || ($exttool eq 'tab') || $uselink) { $headjs = ' -
- -$linktext +
$preamble + +$linktext$extlinkimg
ENDLINK } - if ($explanation ne '') { - $output .= '
'.$explanation.'
'; - } - if (&Apache::lonnet::EXT('resource.0.gradable')) { - $output .= &Apache::lonfeedback::list_discussion('tool','OPEN'); + if ($exttool) { + if ($explanation ne '') { + $output .= '
'.$explanation.'
'; + } + if (&Apache::lonnet::EXT('resource.0.gradable')) { + $output .= &Apache::lonfeedback::list_discussion('tool','OPEN'); + } } } else { if ($uselink) { @@ -317,7 +384,7 @@ sub handler { my $url = $r->uri; my ($is_ext,$brcrum,$absolute,$is_pdf,$exttool,$cdom,$cnum,$hostname, - $linktext,$explanation,$width,$height); + $linktext,$explanation,$width,$height,$reuse,$is_supp); for ($url){ s|^/adm/wrapper||; @@ -328,6 +395,27 @@ sub handler { if ($url =~ /\.pdf$/i) { $is_pdf = 1; + } elsif (($is_ext) && ($env{'request.course.id'})) { + if ($env{'course.'.$env{'request.course.id'}.'.extresource'}) { + (my $selected,$reuse,$width,$height) = split(/:/,$env{'course.'.$env{'request.course.id'}.'.extresource'}); + if ($selected eq 'tab') { + $is_ext = 'tab'; + $width = ''; + $height = ''; + } elsif ($selected eq 'window') { + $is_ext = 'window'; + unless ($width =~ /^\d+$/) { + $width = ''; + } + unless ($height =~ /^\d+$/) { + $height = ''; + } + } else { + $width = ''; + $height = ''; + $reuse = ''; + } + } } elsif ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) { $cdom = $1; $cnum = $2; @@ -372,6 +460,7 @@ sub handler { if ($env{'form.anchor'} ne '') { $url .= '#'.$env{'form.anchor'}; } + $is_supp = 1; } my $type = 'ext'; if ($exttool) { @@ -395,8 +484,34 @@ sub handler { $title = &mt('External Tool'); } } + $title = &HTML::Entities::encode($title,'\'"<>&'); + $is_supp = 1; + if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom); + } + $brcrum = + &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } + } elsif ($env{'request.course.id'}) { + my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'}); + $courseurl =~ s{^/}{}; + if ($url =~ m{^\Q/uploaded/$courseurl/supplemental/\E}) { + $is_supp = 1; + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['folderpath','title']); + if ($env{'form.folderpath'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom); + } + my $title = $env{'form.title'}; + $title = &HTML::Entities::encode($title,'\'"<>&'); + my $crstype = &Apache::loncommon::course_type(); $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } } @@ -429,7 +544,8 @@ sub handler { } $r->print( wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool, - $linktext,$explanation,undef,$width,$height) ); + $linktext,$explanation,undef,$width,$height,$reuse, + $is_supp) ); } # not just the menu @@ -456,7 +572,7 @@ described at http://www.lon-capa.org. =over -=item wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation,$title,$width,$height) +=item wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation,$title,$width,$height,$reuse,$is_supp) =over @@ -499,7 +615,11 @@ in Firefox 23 and later, when serving fr =item $is_ext -true if URL is for an external resource. +true if URL is for an external resource. Default true value +is 1 (display in iframe, unless $uselink is true). +If external resource is to be displayed in a tab, +value of $is_ext will be tab, if to be displayed in a pop-up window, +value of $is_ext will be window. =item $is_pdf @@ -511,20 +631,20 @@ If URL is for an External Tool, will con =item $linktext -optional. If URL is for an External Tool, and target type is window or tab, +optional. If URL is for an External Tool, and target type is window or tab, then the link text may be an option set in the course for each tool instance, or may be a default defined in the domain for all instances of the tool. =item $explanation -optional. If URL is for an External Tool, and target type is window or tab, +optional. If URL is for an External Tool, and target type is window or tab, then the explanation is an option set in the course for each tool instance, or may be a default defined in the domain for all instances of the tool. =item $title -optional. If wrapped item is a PDF, and $env{'browser.mobile'} -is true, a link to a PDF is shown. The "title" will be displayed +optional. If wrapped item is a PDF, and $clientmobile is true, +a link to a PDF is shown. The "title" will be displayed above the link, but if not provided as an arg, $env{'form.title'} will be used, otherwise, the filename will be displayed (unless hidden URL set for the resource). @@ -532,16 +652,26 @@ hidden URL set for the resource). =item $width optional. If URL is for an External Tool, and target type is window, -then a default width may have been defined in the domain for all instances of +then a default width may have been defined in the domain for all instances of the tool. If so, that width will be used for the window opened (via a link) -to launch the external tool. +to launch the external tool. If the URL is for an External Resource, and +$is_ext is window, then a default width (px) may have been defined in the current +course for all external resource instances. =item $height optional. If URL is for an External Tool, and target type is window, -then a default height may have been defined in the domain for all instances of +then a default height may have been defined in the domain for all instances of the tool. If so, that height will be used for the window opened (via a link) -to launch the external tool. +to launch the external tool. If the URL is for an External Resource, and +$is_ext is window, then a default height (px) may have been defined in the current +course for all external resource instances. + +=item $reuse + +optional. If the URL is for an External Resource, and $is_ext is tab or window, +then $reuse will be true if the same tab or window is to be reused for display +of all external resource instances in a a course. =back @@ -552,21 +682,21 @@ Returns markup for the entire page. Content handler for requests for: /adm/wrapper/... used for content to be displayed in an iframe, or launched in a separate tab or window via a link. The target URL is extracted from the requested URL, by -removing the /adm/wrapper prefix. +removing the /adm/wrapper prefix. -The target URL will typically be a PDF served from the current server, an +The target URL will typically be a PDF served from the current server, an external resource URL served from a different server, or an external tool (from an LTI Provider) launched from LON-CAPA (as LTI Consumer) and launched via a link. If the request included forceedit in the query string, and the requester has -rights to modify course content, then the editor will be didplayed to allow +rights to modify course content, then the editor will be displayed to allow changes to be made to the resource (e.g., change the URL of the external resource, -or change the setting for the external tool instance. +or change the setting for the external tool instance). If not in edit mode, then the wrapper() subroutine will be called to generate the standard LON-CAPA inline menu, and then either a link to launch a separate tab or -window, or an iframe to display the content inline. +window, or an iframe to display the content inline. =back