--- loncom/interface/lonhtmlcommon.pm 2021/04/29 17:45:22 1.398
+++ loncom/interface/lonhtmlcommon.pm 2024/09/17 13:06:49 1.414
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common html routines
#
-# $Id: lonhtmlcommon.pm,v 1.398 2021/04/29 17:45:22 raeburn Exp $
+# $Id: lonhtmlcommon.pm,v 1.414 2024/09/17 13:06:49 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -79,7 +79,8 @@ sub coursepreflink {
my ($text,$category)=@_;
if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {
my $target =' target="_top"';
- if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
+ if ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
+ (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
$target ='';
}
return '&"').'">'.$text.'';
@@ -106,7 +107,8 @@ sub direct_parm_link {
$part=&entity_encode($part);
if (($symb) && (&Apache::lonnet::allowed('opa')) && ($target ne 'tex')) {
my $target=' target="_top"';
- if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
+ if ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
+ (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
$target='';
}
return "$linktext";
@@ -229,15 +231,16 @@ sub dependencycheck_js {
$link = '/adm/dependencies?symb='.&HTML::Entities::encode($symb,'<>&"');
} elsif ($folderpath) {
$link = '/adm/dependencies?folderpath='.&HTML::Entities::encode($folderpath,'<>&"');
- $url = $uri;
+ $url = $uri;
} elsif ($uri =~ m{^/public/$match_domain/$match_courseid/syllabus$}) {
$link = '/adm/dependencies';
}
- $link .= (($link=~/\?/)?'&':'?').'title='.
+ $link .= (($link=~/\?/)?'&':'?').'title='.
&HTML::Entities::encode($title,'<>&"');
if ($url) {
$link .= '&url='.&HTML::Entities::encode($url,'<>&"');
}
+ &js_escape(\$link);
return <
//
-
-
+
+
+
@@ -1735,14 +1738,31 @@ sub show_return_link {
unless ($env{'request.course.id'}) { return 0; }
if ($env{'request.noversionuri'}=~m{^/priv/} ||
$env{'request.uri'}=~m{^/priv/}) { return 1; }
- return if ($env{'request.noversionuri'} eq '/adm/supplemental');
+ return if (($env{'request.noversionuri'} eq '/adm/supplemental') &&
+ ($env{'form.folder'} ne 'supplemental'));
+ return if (($env{'form.folderpath'} ne '') &&
+ (($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) ||
+ ($env{'request.noversionuri'} =~ m{^/public/$match_domain/$match_courseid/syllabus$})));
return if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
(!$env{'request.role.adv'}));
- if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
+ if (($env{'request.noversionuri'} =~ m{^/adm/viewclasslist($|\?)})
|| ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
return if ($env{'form.register'});
}
+ if ((($env{'request.symb'} ne '') || ($env{'form.folderpath'} ne '')) &&
+ ($env{'request.noversionuri'} =~m{^/adm/coursedocs/showdoc/uploaded/($match_domain)/($match_courseid)/(docs|supplemental)/})) {
+ my ($cdom,$cnum,$area) = ($1,$2,$3);
+ if (($env{'course.'.$env{'request.course.id'}.'.domain'} eq $cdom) &&
+ ($env{'course.'.$env{'request.course.id'}.'.num'} eq $cnum)) {
+ if (($env{'request.symb'}) && ($area eq 'docs')) {
+ my ($map,$resid,$url) = &Apache::lonnet::decode_symb($env{'request.symb'});
+ return if ($env{'request.noversionuri'} eq '/adm/coursedocs/showdoc/'.$url);
+ } elsif (($env{'form.folderpath'}) && ($area eq 'supplemental')) {
+ return;
+ }
+ }
+ }
return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
$env{'request.symb'} eq '')
||
@@ -1811,6 +1831,54 @@ clientTime = (new Date()).getTime();
END
}
+##
+# Client-side javascript to convert any dashes in text pasted
+# into textbox(es) for numericalresponse item(s) to a standard
+# minus, i.e., - . Calls to dash_to_minus_js() in end_problem()
+# and in loncommon::endbodytag() for a .page (arg: dashjs => 1)
+#
+# Will apply to any input tag with class: LC_numresponse_text.
+# Currently set in start_textline for numericalresponse items.
+#
+
+sub dash_to_minus_js {
+ return <<'ENDJS';
+
+
+
+ENDJS
+}
+
############################################################
############################################################
@@ -1847,9 +1915,10 @@ boolean, controls whether to include a l
if 'nohelp' don't include the orange help link
-=item $css_class
+=item $crumbs_style
-optional name for the class to apply to the table for CSS
+optional style attribute for div containing breadcrumbs
+unless called from docs_breadcrumbs
=item $no_mt
@@ -1870,6 +1939,13 @@ loncommon::help_open_topic() to generate
text to include in the link in the optional help item ($topic_help) on the right
side of the breadcrumbs row.
+=item $links_target
+
+optionally includes the target (_top, _parent or _self) for (i) initial
+$menulink item in the breadcrumbs (if present), (ii) return to last location
+(if present), and (iii) help item at the right side of breadcrumbs menu,
+created by loncommon::help_open_topic() or loncommon::help_open_menu().
+
=back
=back
@@ -1900,11 +1976,9 @@ returns: nothing
my %tools = ();
sub breadcrumbs {
- my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt,
- $CourseBreadcrumbs,$topic_help,$topic_help_text,$crstype) = @_;
+ my ($component,$component_help,$menulink,$helplink,$crumbs_style,$no_mt,
+ $CourseBreadcrumbs,$topic_help,$topic_help_text,$links_target) = @_;
#
- $css_class ||= 'LC_breadcrumbs';
-
# Make the faq and bug data cascade
my $faq = '';
my $bug = '';
@@ -1917,6 +1991,16 @@ returns: nothing
# The first one should be the course or a menu link
if (!defined($menulink)) { $menulink=1; }
if ($menulink) {
+ if ($env{'request.course.id'}) {
+ my ($menucoll,$deeplinkmenu,$menuref) = &Apache::loncommon::menucoll_in_effect();
+ if (($menucoll) && (ref($menuref) eq 'HASH')) {
+ if ($menuref->{'main'} eq 'n') {
+ undef($menulink);
+ }
+ }
+ }
+ }
+ if ($menulink) {
my $description = 'Menu';
my $no_mt_descr = 0;
if ((exists($env{'request.course.id'})) &&
@@ -1935,7 +2019,10 @@ returns: nothing
}
}
my $target = '_top';
- if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
+ if ($links_target) {
+ $target = $links_target;
+ } elsif ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
+ (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
$target='';
}
$menulink = { href =>'/adm/menu',
@@ -1958,11 +2045,8 @@ returns: nothing
title => &mt('Back to most recent content resource'),
class => 'LC_menubuttons_link',
};
- if ($env{'request.noversionuri'} eq '/adm/searchcat') {
- $hashref->{'target'} = '_top';
- if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) {
- $hashref->{'target'} = '';
- }
+ if ($links_target) {
+ $hashref->{'target'} = $links_target;
}
$links=&htmltag( 'a','
',
$hashref);
@@ -2013,11 +2097,12 @@ returns: nothing
if ($faq ne '' || $component_help ne '' || $bug ne '') {
$icons .= &Apache::loncommon::help_open_menu($component,
$component_help,
- $faq,$bug);
+ $faq,$bug,'','','','',
+ $links_target);
}
if ($topic_help && $topic_help_text) {
$icons .= ' '.&Apache::loncommon::help_open_topic($topic_help,&mt($topic_help_text),'',
- undef,600);
+ undef,600,'',$links_target);
}
#
@@ -2047,8 +2132,13 @@ returns: nothing
}
if (($links ne '') || ($nav_and_tools)) {
&render_tools(\$links);
- $links = &htmltag('div', $links,
- { id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ;
+ unless ($CourseBreadcrumbs) {
+ my $args = { id => 'LC_breadcrumbs' };
+ if ($crumbs_style ne '') {
+ $args->{'style'} = $crumbs_style;
+ }
+ $links = &htmltag('div', $links, $args);
+ }
}
my $adv_tools = 0;
if (ref($tools{'advtools'}) eq 'ARRAY') {
@@ -2217,7 +2307,7 @@ returns: nothing
} # End of scope for @Crumbs
sub docs_breadcrumbs {
- my ($allowed,$crstype,$contenteditor,$title,$precleared)=@_;
+ my ($allowed,$crstype,$contenteditor,$title,$precleared,$checklinkprot)=@_;
my ($folderpath,@folders,$supplementalflag);
@folders = split('&',$env{'form.folderpath'});
if ($env{'form.folderpath'} =~ /^supplemental/) {
@@ -2243,8 +2333,10 @@ sub docs_breadcrumbs {
# each of randompick number, hidden, encrypted, random order, is_page
# are appended with ":"s to the foldername
$name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//;
- unless ($supplementalflag) {
- if ($contenteditor) {
+ if ($contenteditor) {
+ if ($supplementalflag) {
+ if ($2) { $ishidden=1; }
+ } else {
if ($1 ne '') {
$randompick=$1;
} else {
@@ -2285,9 +2377,17 @@ sub docs_breadcrumbs {
$plain=~s/\>\;\s*$//;
}
my $menulink = 0;
- if (!$allowed && !$contenteditor) {
+ if (!$allowed && !$contenteditor && !$supplementalflag) {
$menulink = 1;
}
+ if ($checklinkprot) {
+ if ($env{'request.deeplink.login'}) {
+ my $linkprotout = &Apache::lonmenu::linkprot_exit();
+ if ($linkprotout) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$linkprotout);
+ }
+ }
+ }
return (&breadcrumbs(undef,undef,$menulink,'nohelp',undef,undef,
$contenteditor),
$randompick,$ishidden,$isencrypted,$plain,
@@ -3423,12 +3523,18 @@ PARAMSONE
if (itemid != null) {
itemh = itemid.offsetHeight;
}
- var primaryheight = document.getElementById('LC_nav_bar').offsetHeight;
- var secondaryheight;
+ var primaryheight = 0;
+ if (document.getElementById('LC_nav_bar') != null) {
+ primaryheight = document.getElementById('LC_nav_bar').offsetHeight;
+ }
+ var secondaryheight = 0;
if (document.getElementById('LC_secondary_menu') != null) {
secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight;
}
- var crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight;
+ var crumbsheight = 0;
+ if (document.getElementById('LC_breadcrumbs') != null) {
+ crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight;
+ }
var dccidheight = 0;
if (document.getElementById('dccid') != null) {
dccidheight = document.getElementById('dccid').offsetHeight;
@@ -3501,7 +3607,10 @@ THIRD
sub javascript_jumpto_resource {
my $confirm_switch = &mt("Editing requires switching to the resource's home server.")."\n".
&mt('Switch server?');
+ my $confirm_new_tab = &mt("Editing requires using the resource's home server.")."\n".
+ &mt('Open a new browser tab?');
&js_escape(\$confirm_switch);
+ &js_escape(\$confirm_new_tab);
return (<&');
- if ($symb) {
- $cfile .= '&symb='.&HTML::Entities::encode($symb,'"<>&');
+ if ($shownsymb) {
+ $cfile .= '&symb='.&HTML::Entities::encode($shownsymb,'"<>&');
+ if ($resedit) {
+ $cfile .= '&edit=1';
+ }
} elsif ($folderpath) {
$cfile .= '&folderpath='.&HTML::Entities::encode($folderpath,'"<>&');
}
@@ -3554,7 +3687,7 @@ sub jump_to_editres {
if ($forcereg) {
$cfile .= '®ister=1';
}
- $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."');";
+ $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."','$target')";
}
} else {
unless ($cfile =~ m{^/priv/}) {