--- loncom/interface/lonmenu.pm 2022/09/19 19:39:48 1.369.2.83.2.5
+++ loncom/interface/lonmenu.pm 2023/04/02 03:16:26 1.530
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.369.2.83.2.5 2022/09/19 19:39:48 raeburn Exp $
+# $Id: lonmenu.pm,v 1.530 2023/04/02 03:16:26 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -118,72 +118,51 @@ Same as primary_menu() but operates on @
=item create_submenu()
-Creates XHTML for unordered list of sub-menu items which belong to a
+Creates XHTML for unordered list of sub-menu items which belong to a
particular top-level menu item. Uses hover pseudo class in css to display
-dropdown list when mouse hovers over top-level item. Support for IE6
+dropdown list when mouse hovers over top-level item. Support for IE6
(no hover psuedo class) via LC_hoverable class for
tag for top-
level item, which employs jQuery to handle behavior on mouseover.
Inputs: 6 - (a) link and (b) target for anchor href in top level item,
- (c) title for text wrapped by anchor tag in top level item.
- (d) reference to array of arrays of sub-menu items.
- (e) boolean to indicate whether to call &mt() to translate
+ (c) title for text wrapped by anchor tag in top level item,
+ (d) reference to array of arrays of sub-menu items,
+ (e) boolean to indicate whether to call &mt() to translate
name of menu item,
(f) optional class for
element in primary menu, for which
sub menu is being generated.
-The underlying datastructure used in (d) contains data from mydesk.tab.
-It consists of an array which has an array for each item appearing in
-the menu (e.g. [["link", "title", "condition"]] for a single-item menu).
-create_submenu() supports also the creation of XHTML for nested dropdown
-menus represented by unordered lists. This is done by replacing the
-scalar used for the link with an arrayreference containing the menuitems
-for the nested menu. This can be done recursively so that the next menu
-may also contain nested submenus.
+ The underlying datastructure used in (d) contains data from mydesk.tab.
+ It consists of an array which has an array for each item appearing in
+ the menu (e.g. [["link", "title", "condition"]] for a single-item menu).
+ create_submenu() supports also the creation of XHTML for nested dropdown
+ menus represented by unordered lists. This is done by replacing the
+ scalar used for the link with an arrayreference containing the menuitems
+ for the nested menu. This can be done recursively so that the next menu
+ may also contain nested submenus.
Example:
- [ # begin of datastructure
- ["/home/", "Home", "condition1"], # 1st item of the 1st layer menu
- [ # 2nd item of the 1st layer menu
- [ # anon. array for nested menu
- ["/path1", "Path1", undef], # 1st item of the 2nd layer menu
- ["/path2", "Path2", undef], # 2nd item of the 2nd layer menu
- [ # 3rd item of the 2nd layer menu
- [[...], [...], ..., [...]], # containing another menu layer
- "Sub-Sub-Menu", # title for this container
- undef
- ]
- ], # end of array/nested menu
- "Sub-Menu", # title for the container item
- undef
- ] # end of 2nd item of the 1st layer menu
+ [ # begin of datastructure
+ ["/home/", "Home", "condition1"], # 1st item of the 1st layer menu
+ [ # 2nd item of the 1st layer menu
+ [ # anon. array for nested menu
+ ["/path1", "Path1", undef], # 1st item of the 2nd layer menu
+ ["/path2", "Path2", undef], # 2nd item of the 2nd layer menu
+ [ # 3rd item of the 2nd layer menu
+ [[...], [...], ..., [...]], # containing another menu layer
+ "Sub-Sub-Menu", # title for this container
+ undef
+ ]
+ ], # end of array/nested menu
+ "Sub-Menu", # title for the container item
+ undef
+ ] # end of 2nd item of the 1st layer menu
]
-
=item innerregister()
This gets called in order to register a URL in the body of the document
-=item loadevents()
-
-=item unloadevents()
-
-=item startupremote()
-
-=item setflags()
-
-=item maincall()
-
-=item load_remote_msg()
-
-=item get_menu_name()
-
-=item reopenmenu()
-
-=item open()
-
-Open the menu
-
=item clear()
=item switch()
@@ -231,6 +210,7 @@ use Apache::lonenc();
use Apache::lonlocal;
use Apache::lonmsg();
use LONCAPA qw(:DEFAULT :match);
+use LONCAPA::ltiutils;
use HTML::Entities();
use Apache::lonwishlist();
@@ -267,7 +247,7 @@ sub prep_menuitem {
# entries from mydesk.tab
sub primary_menu {
my ($crstype,$ltimenu,$menucoll,$menuref,$links_disabled,$links_target) = @_;
- my (%menu,%menuopts);
+ my (%menu,%ltiexc,%menuopts);
# each element of @primary contains following array:
# (link url, icon path, alt text, link text, condition, position)
my $public;
@@ -275,6 +255,26 @@ sub primary_menu {
|| (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
$public = 1;
}
+ my $rolecount;
+ if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) {
+ my $update=$env{'user.update.time'};
+ if (!$update) {
+ $update = $env{'user.login.time'};
+ }
+ my %roles_in_env;
+ $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update);
+ }
+ my $lti;
+ if ($env{'request.lti.login'}) {
+ $lti = 1;
+ if (ref($ltimenu) eq 'HASH') {
+ foreach my $item ('fullname','logout') {
+ unless ($ltimenu->{$item}) {
+ $ltiexc{$item} = 1;
+ }
+ }
+ }
+ }
my ($listclass,$linkattr,$target);
if ($links_disabled) {
$listclass = 'LCisDisabled';
@@ -282,12 +282,15 @@ sub primary_menu {
}
if ($links_target ne '') {
$target = $links_target;
- } else {
- my $deeplinktarget;
+ } else {
+ my ($ltitarget,$deeplinktarget);
+ if ($env{'request.lti.login'}) {
+ $ltitarget = $env{'request.lti.target'};
+ }
if ($env{'request.deeplink.login'}) {
$deeplinktarget = $env{'request.deeplink.target'};
}
- if ($deeplinktarget eq '_self') {
+ if (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) {
$target = '_self';
} else {
$target = '_top';
@@ -310,11 +313,23 @@ sub primary_menu {
&& !$public; # only visible to public
# users
next if $$menuitem[4] eq 'roles' ##show links depending on
- && &Apache::loncommon::show_course(); ##term 'Courses' or
- next if $$menuitem[4] eq 'courses' ##'Roles' wanted
- && !&Apache::loncommon::show_course(); ##
-
+ && (&Apache::loncommon::show_course() ##term 'Courses' or
+ || $lti); ##'Roles' wanted
+ next if $$menuitem[4] eq 'courses' ##and not LTI access
+ && (!&Apache::loncommon::show_course()
+ || $lti);
+ next if $$menuitem[4] eq 'notlti'
+ && $lti;
+ next if $$menuitem[4] eq 'ltiexc'
+ && exists($ltiexc{lc($menuitem->[3])});
my $title = $menuitem->[3];
+ if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) {
+ if ($menuitem->[4] eq 'courses') {
+ next unless ($rolecount>1);
+ } else {
+ next unless (($title eq 'Personal') || ($title eq 'Logout'));
+ }
+ }
my $position = $menuitem->[5];
if ($position eq '') {
$position = 'right';
@@ -322,7 +337,7 @@ sub primary_menu {
if ($env{'request.course.id'} && $menucoll) {
if (($menuitem->[6]) && (!$menuopts{$menuitem->[6]})) {
if ($menuitem->[6] eq 'pers') {
- if ($menuopts{'name'} &&
+ if ($menuopts{'name'} && !$ltiexc{'fullname'} &&
$env{'user.name'} && $env{'user.domain'}) {
$menu{$position} .= '