--- loncom/interface/lonmenu.pm 2022/01/03 16:37:24 1.369.2.83.2.1
+++ loncom/interface/lonmenu.pm 2022/05/29 21:49:06 1.369.2.83.2.2
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.369.2.83.2.1 2022/01/03 16:37:24 raeburn Exp $
+# $Id: lonmenu.pm,v 1.369.2.83.2.2 2022/05/29 21:49:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -99,7 +99,7 @@ It gets filled in the BEGIN block of thi
=over
-=item prep_menuitems(\@menuitem)
+=item prep_menuitems(\@menuitem,$target,$listclass,$linkattr)
This routine wraps a menuitem in proper HTML. It is used by primary_menu() and
secondary_menu().
@@ -240,9 +240,9 @@ use vars qw(@desklines %category_names %
my @inlineremote;
sub prep_menuitem {
- my ($menuitem,$listclass,$linkattr) = @_;
+ my ($menuitem,$target,$listclass,$linkattr) = @_;
return '' unless(ref($menuitem) eq 'ARRAY');
- my $link;
+ my ($link,$targetattr);
if ($$menuitem[1]) { # graphical Link
$link = "':'
').'$link|;
+ . qq| href="$$menuitem[0]"$targetattr $linkattr>$link|;
}
# primary_menu() evaluates @primary_menu and returns a two item array,
@@ -263,7 +266,7 @@ sub prep_menuitem {
# @primary_menu is filled within the BEGIN block of this module with
# entries from mydesk.tab
sub primary_menu {
- my ($crstype,$ltimenu,$menucoll,$menuref,$links_disabled) = @_;
+ my ($crstype,$ltimenu,$menucoll,$menuref,$links_disabled,$links_target) = @_;
my (%menu,%menuopts);
# each element of @primary contains following array:
# (link url, icon path, alt text, link text, condition, position)
@@ -272,6 +275,24 @@ sub primary_menu {
|| (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
$public = 1;
}
+ my ($listclass,$linkattr,$target);
+ if ($links_disabled) {
+ $listclass = 'LCisDisabled';
+ $linkattr = 'aria-disabled="true"';
+ }
+ if ($links_target ne '') {
+ $target = $links_target;
+ } else {
+ my $deeplinktarget;
+ if ($env{'request.deeplink.login'}) {
+ $deeplinktarget = $env{'request.deeplink.target'};
+ }
+ if ($deeplinktarget eq '_self') {
+ $target = '_self';
+ } else {
+ $target = '_top';
+ }
+ }
if (($menucoll) && (ref($menuref) eq 'HASH')) {
%menuopts = %{$menuref};
}
@@ -315,16 +336,10 @@ sub primary_menu {
}
}
}
- my ($listclass,$linkattr);
- if ($links_disabled) {
- $listclass = 'LCisDisabled';
- $linkattr = 'aria-disabled="true"';
- }
if (defined($primary_submenu{$title})) {
- my ($link,$target);
+ my $link;
if ($menuitem->[0] ne '') {
$link = $menuitem->[0];
- $target = '_top';
} else {
$link = '#';
}
@@ -370,7 +385,7 @@ sub primary_menu {
'helpdeskmail',
$defdom,$origmail);
if ($to ne '') {
- $menu{$position} .= &prep_menuitem($menuitem,$listclass,$linkattr);
+ $menu{$position} .= &prep_menuitem($menuitem,$target,$listclass,$linkattr);
}
} else {
$menu{$position} .= ($listclass?'':'').
@@ -383,9 +398,9 @@ sub primary_menu {
$$menuitem[0] = '/adm/login';
}
}
- $menu{$position} .= prep_menuitem($menuitem,$listclass,$linkattr);
+ $menu{$position} .= prep_menuitem($menuitem,$target,$listclass,$linkattr);
} else {
- $menu{$position} .= prep_menuitem($menuitem,$listclass,$linkattr);
+ $menu{$position} .= prep_menuitem($menuitem,$target,$listclass,$linkattr);
}
}
my @output = ('','');
@@ -424,7 +439,8 @@ sub getauthor{
}
sub secondary_menu {
- my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref,$links_disabled) = @_;
+ my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref,
+ $links_disabled,$links_target) = @_;
my $menu;
my $crstype = &Apache::loncommon::course_type();
@@ -487,7 +503,7 @@ sub secondary_menu {
%menuopts = %{$menuref};
}
- my ($listclass,$linkattr);
+ my ($listclass,$linkattr,$target);
if ($links_disabled) {
$listclass = 'LCisDisabled';
$linkattr = 'aria-disabled="true"';
@@ -503,6 +519,19 @@ sub secondary_menu {
}
my ($roleswitcher_js,$roleswitcher_form);
+ if ($links_target ne '') {
+ $target = $links_target;
+ } else {
+ my $deeplinktarget
+ if ($env{'request.deeplink.login'}) {
+ $deeplinktarget = $env{'request.deeplink.target'};
+ }
+ if ($deeplinktarget eq '_self') {
+ $target = '_self';
+ } else {
+ $target = '_top';
+ }
+ }
foreach my $menuitem (@secondary_menu) {
# evaluate conditions
@@ -554,10 +583,9 @@ sub secondary_menu {
}
}
if (defined($secondary_submenu{$title})) {
- my ($link,$target);
+ my $link;
if ($menuitem->[0] ne '') {
$link = $menuitem->[0];
- $target = '_top';
} else {
$link = '#';
}
@@ -594,7 +622,7 @@ sub secondary_menu {
&roles_selector(
$env{'course.' . $env{'request.course.id'} . '.domain'},
$env{'course.' . $env{'request.course.id'} . '.num'},
- $httphost
+ $httphost,$target,$menucoll,$menuref
);
if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]})) {
next unless ($has_opa_priv);
@@ -625,7 +653,7 @@ sub secondary_menu {
}
$$menuitem[0] = &HTML::Entities::encode($$menuitem[0],'&<>"');
}
- $menu .= &prep_menuitem(\@$menuitem,$listclass,$linkattr);
+ $menu .= &prep_menuitem(\@$menuitem,$target,$listclass,$linkattr);
}
}
if ($menu =~ /\[url\].*\[symb\]/) {
@@ -665,12 +693,12 @@ sub secondary_menu {
sub create_submenu {
my ($link,$target,$title,$submenu,$translate,$addclass,$listclass,$linkattr) = @_;
return unless (ref($submenu) eq 'ARRAY');
- my $disptarget;
- if ($target ne '') {
- $disptarget = ' target="'.$target.'"';
+ my $targetattr;
+ if (($target ne '') && ($link ne '#')) {
+ $targetattr = ' target="'.$target.'"';
}
my $menu = ''.
- ''.
+ ''.
''.$title.
''.
' ▼'.
@@ -747,14 +775,16 @@ sub build_submenu {
}
$href =~ s/\[returnurl\]/$returnurl/;
}
+ my $targetattr;
unless (($href eq '') || ($href =~ /^\#/)) {
- $target = ' target="_top"';
+ if ($target ne '') {
+ $targetattr = ' target="'.$target.'"';
}
$menu .= '';
- $menu .= '' . $title . '';
+ $menu .= '' . $title . '';
$menu .= '';
}
}
@@ -2532,6 +2562,11 @@ sub utilityfunctions {
my $countdown = &countdown_toggle_js();
+ my $deeplinktarget;
+ if ($env{'request.deeplink.login'}) {
+ $deeplinktarget = $env{'request.deeplink.target'};
+ }
+
my $annotateurl = '/adm/annotation';
if ($httphost) {
$annotateurl = '/adm/annotations';
@@ -2632,7 +2667,12 @@ function golist(url) {
currentURL = null;
currentSymb= null;
var lcHostname = setLCHost();
- top.location.href=lcHostname+url;
+ var deeplinktarget = '$deeplinktarget';
+ if (deeplinktarget == '_self') {
+ document.location.href=lcHostname+url;
+ } else {
+ top.location.href=lcHostname+url;
+ }
}
}
@@ -2710,8 +2750,14 @@ ENDUTILITY
}
sub serverform {
+ my $target;
+ if (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) {
+ $target = ' target="_self"';
+ } else {
+ $target = ' target="_top"';
+ }
return(<
+