--- loncom/interface/lonmenu.pm 2024/01/02 03:46:06 1.369.2.83.2.14
+++ loncom/interface/lonmenu.pm 2016/04/04 17:24:05 1.444
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.369.2.83.2.14 2024/01/02 03:46:06 raeburn Exp $
+# $Id: lonmenu.pm,v 1.444 2016/04/04 17:24:05 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,$target,$listclass,$linkattr)
+=item prep_menuitems(\@menuitem)
This routine wraps a menuitem in proper HTML. It is used by primary_menu() and
secondary_menu().
@@ -118,72 +118,47 @@ 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,
+Inputs: 4 - (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
- 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()
@@ -235,14 +210,14 @@ use HTML::Entities();
use Apache::lonwishlist();
use vars qw(@desklines %category_names %category_members %category_positions
- $readdesk @primary_menu %primary_submenu @secondary_menu %secondary_submenu);
+ $readdesk @primary_menu %primary_submenu @secondary_menu);
my @inlineremote;
sub prep_menuitem {
- my ($menuitem,$target,$listclass,$linkattr) = @_;
+ my ($menuitem) = @_;
return '' unless(ref($menuitem) eq 'ARRAY');
- my ($link,$targetattr);
+ my $link;
if ($$menuitem[1]) { # graphical Link
$link = " ':' ').'$link |;
+ . qq| href="$$menuitem[0]" target="_top">$link|;
}
# primary_menu() evaluates @primary_menu and returns a two item array,
@@ -266,8 +238,8 @@ 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,$links_target) = @_;
- my (%menu,%ltiexc,%menuopts);
+ my ($crstype) = @_;
+ my (%menu);
# each element of @primary contains following array:
# (link url, icon path, alt text, link text, condition, position)
my $public;
@@ -275,40 +247,14 @@ sub primary_menu {
|| (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
$public = 1;
}
- 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 $rolecount;
+ if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) {
+ my $update=$env{'user.update.time'};
+ if (!$update) {
+ $update = $env{'user.login.time'};
}
- }
- my ($listclass,$linkattr,$target);
- if ($links_disabled) {
- $listclass = 'LCisDisabled';
- $linkattr = 'aria-disabled="true"';
- }
- if ($links_target ne '') {
- $target = $links_target;
- } 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 (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) {
- $target = '_self';
- } else {
- $target = '_top';
- }
- }
- if (($menucoll) && (ref($menuref) eq 'HASH')) {
- %menuopts = %{$menuref};
+ my %roles_in_env;
+ $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update);
}
foreach my $menuitem (@primary_menu) {
# evaluate conditions
@@ -324,92 +270,53 @@ 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
- || $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])});
+ && &Apache::loncommon::show_course(); ##term 'Courses' or
+ next if $$menuitem[4] eq 'courses' ##'Roles' wanted
+ && !&Apache::loncommon::show_course(); ##
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';
}
- if ($env{'request.course.id'} && $menucoll) {
- if (($menuitem->[6]) && (!$menuopts{$menuitem->[6]})) {
- if ($menuitem->[6] eq 'pers') {
- if ($menuopts{'name'} && !$ltiexc{'fullname'} &&
- $env{'user.name'} && $env{'user.domain'}) {
- $menu{$position} .= ''.
- &Apache::loncommon::plainname($env{'user.name'},
- $env{'user.domain'}).' ';
- next;
- } else {
- next;
- }
- } else {
- next;
- }
- }
- }
if (defined($primary_submenu{$title})) {
- my $link;
+ my ($link,$target);
if ($menuitem->[0] ne '') {
$link = $menuitem->[0];
+ $target = '_top';
} else {
$link = '#';
}
my @primsub;
if (ref($primary_submenu{$title}) eq 'ARRAY') {
foreach my $item (@{$primary_submenu{$title}}) {
- next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'}));
- next if ((($item->[2] eq 'portfolio') ||
- ($item->[2] eq 'blog')) &&
+ next if (($crstype eq 'Placement') && (!$env{'request.role.adv'}));
+ next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'}));
+ next if ((($item->[2] eq 'portfolio') ||
+ ($item->[2] eq 'blog')) &&
(!&Apache::lonnet::usertools_access('','',$item->[2],
undef,'tools')));
- if (($item->[2] eq 'browsepub') && ($item->[0] eq '/res/')) {
- if ($env{'request.role'} =~ /^au\./) {
- $item->[0] .= $env{'request.role.domain'}.'/?launch=1';
- } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) {
- $item->[0] .= $1.'/'.$2.'/?launch=1';
- } elsif (&Apache::lonnet::allowed('bre',$env{'user.domain'})) {
- $item->[0] .= $env{'user.domain'}.'/?launch=1';
- } elsif (&Apache::lonnet::allowed('bro','/res/')) {
- $item->[0] .= '?launch=1';
- } else {
- next;
- }
- }
- if ($env{'request.course.id'} && $menucoll) {
- next if ($item->[3]) && (!$menuopts{$item->[3]});
- }
push(@primsub,$item);
}
- if ($title eq 'Personal') {
- if ($env{'user.name'} && $env{'user.domain'} && !$ltiexc{'fullname'}) {
- unless (($env{'request.course.id'}) && ($menucoll) && (!$menuopts{'name'})) {
- $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
- }
- }
- next if (($env{'request.course.id'}) && ($menucoll) && ($title eq 'Personal') &&
- (!@primsub));
- if ($title eq 'Personal') {
- $title = &mt($title);
- }
+ if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) {
+ $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
} else {
$title = &mt($title);
}
if (@primsub > 0) {
- $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1,undef,$listclass,$linkattr);
+ $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1);
} elsif ($link) {
- $menu{$position} .= ($listclass?'':' ').
- ''.$title.' ';
+ $menu{$position} .= ''.$title.' ';
}
}
} elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
+ next if ($crstype eq 'Placement');
if ($public) {
my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
my $defdom = &Apache::lonnet::default_login_domain();
@@ -417,22 +324,13 @@ sub primary_menu {
'helpdeskmail',
$defdom,$origmail);
if ($to ne '') {
- $menu{$position} .= &prep_menuitem($menuitem,$target,$listclass,$linkattr);
+ $menu{$position} .= &prep_menuitem($menuitem);
}
} else {
- $menu{$position} .= ($listclass?'':' ').
- &Apache::loncommon::top_nav_help('Help',$linkattr).
- ' ';
- }
- } elsif ($$menuitem[3] eq 'Log In') {
- if ($public) {
- if (&Apache::lonnet::get_saml_landing()) {
- $$menuitem[0] = '/adm/login';
- }
+ $menu{$position} .= ''.&Apache::loncommon::top_nav_help('Help').' ';
}
- $menu{$position} .= prep_menuitem($menuitem,$target,$listclass,$linkattr);
} else {
- $menu{$position} .= prep_menuitem($menuitem,$target,$listclass,$linkattr);
+ $menu{$position} .= prep_menuitem($menuitem);
}
}
my @output = ('','');
@@ -471,8 +369,7 @@ sub getauthor{
}
sub secondary_menu {
- my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref,
- $links_disabled,$links_target) = @_;
+ my ($httphost) = @_;
my $menu;
my $crstype = &Apache::loncommon::course_type();
@@ -480,29 +377,27 @@ sub secondary_menu {
? "/$env{'request.course.sec'}"
: '');
my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
- my $canvieweditor = &Apache::lonnet::allowed('cev', $env{'request.course.id'});
my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'};
if ($canviewroster eq 'disabled') {
undef($canviewroster);
}
- my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec);
- my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec);
- my $canviewusers = &Apache::lonnet::allowed('vcl', $crs_sec);
- my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec);
- my $canviewpara = &Apache::lonnet::allowed('vpa', $crs_sec);
+ my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec);
+ my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec);
+ my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec);
my $canmodpara = &Apache::lonnet::allowed('opa', $crs_sec);
my $canvgr = &Apache::lonnet::allowed('vgr', $crs_sec);
- my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec);
- my $canplc = &Apache::lonnet::allowed('plc', $crs_sec);
+ my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec);
my $author = &getauthor();
- my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools,
- $lti,$ltimapres,%ltiexc,%menuopts);
- $grouptools = 0;
+ my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools);
+ $grouptools = 0;
if ($env{'request.course.id'}) {
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- unless ($canedit || $canvieweditor) {
+ if ($canedit) {
+ $showsyllabus = 1;
+ $showfeeds = 1;
+ } else {
unless (&Apache::lonnet::is_on_map("public/$cdom/$cnum/syllabus")) {
if (($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'}) ||
($env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'}) ||
@@ -515,15 +410,16 @@ sub secondary_menu {
$showfeeds = 1;
}
}
- unless ($canmgr || $canvgr) {
+ unless ($canmgr) {
my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom);
if (keys(%slots) > 0) {
$showresv = 1;
}
}
- if ($env{'request.course.groups'} ne '') {
- foreach my $group (split(/:/,$env{'request.course.groups'})) {
- next unless ($group =~ /^\w+$/);
+ my %groups = &Apache::lonnet::get_active_groups(
+ $env{'user.domain'}, $env{'user.name'},$cdom,$cnum);
+ if (%groups) {
+ foreach my $group (keys(%groups)) {
my @privs = split(/:/,$env{"user.priv.$env{'request.role'}./$cdom/$cnum/$group"});
shift(@privs);
if (@privs) {
@@ -531,31 +427,9 @@ sub secondary_menu {
}
}
}
- if ($env{'request.lti.login'}) {
- $lti = 1;
- if (ref($ltimenu) eq 'HASH') {
- foreach my $item ('fullname','coursetitle','role','logout','grades') {
- unless ($ltimenu->{$item}) {
- $ltiexc{$item} = 1;
- }
- }
- }
- if (($ltiscope eq 'map') || ($ltiscope eq 'resource')) {
- $ltimapres = 1;
- }
- }
- }
- if (($menucoll) && (ref($menuref) eq 'HASH')) {
- %menuopts = %{$menuref};
}
- my ($listclass,$linkattr,$target);
- if ($links_disabled) {
- $listclass = 'LCisDisabled';
- $linkattr = 'aria-disabled="true"';
- }
-
- my ($canmodifycoauthor);
+ my ($canmodifycoauthor);
if ($env{'request.role'} eq "au./$env{'user.domain'}/") {
my $extent = "$env{'user.domain'}/$env{'user.name'}";
if ((&Apache::lonnet::allowed('cca',$extent)) ||
@@ -563,166 +437,67 @@ sub secondary_menu {
$canmodifycoauthor = 1;
}
}
-
my ($roleswitcher_js,$roleswitcher_form);
- if ($links_target ne '') {
- $target = $links_target;
- } 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 (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) {
- $target = '_self';
- } else {
- $target = '_top';
- }
- }
foreach my $menuitem (@secondary_menu) {
# evaluate conditions
next if ref($menuitem) ne 'ARRAY';
+ next if (($crstype eq 'Placement') && ($$menuitem[3] ne 'Roles') && (!$env{'request.role.adv'}));
next if $$menuitem[4] ne 'always'
- && ($$menuitem[4] ne 'author' && $$menuitem[4] ne 'cca')
+ && ($$menuitem[4] ne 'author' && $$menuitem[4] ne 'cca')
&& !$env{'request.course.id'};
- next if $$menuitem[4] =~ /^crsedit/
- && (!$canedit && !$canvieweditor);
- next if $$menuitem[4] eq 'crseditCourse'
- && ($crstype eq 'Community');
- next if $$menuitem[4] eq 'crseditCommunity'
- && ($crstype eq 'Course');
+ next if $$menuitem[4] =~ /^mdc/
+ && !$canedit;
next if $$menuitem[4] eq 'nvgr'
- && ($canvgr || $ltiexc{'grades'});
+ && $canvgr;
next if $$menuitem[4] eq 'vgr'
&& !$canvgr;
- next if $$menuitem[4] eq 'viewusers'
- && !$canmodifyuser && !$canviewusers;
- next if $$menuitem[4] eq 'noviewusers'
- && ($canmodifyuser || $canviewusers || !$canviewroster);
+ next if $$menuitem[4] eq 'cst'
+ && !$canmodifyuser;
+ next if $$menuitem[4] eq 'ncst'
+ && ($canmodifyuser || !$canviewroster);
next if $$menuitem[4] eq 'mgr'
&& !$canmgr;
next if $$menuitem[4] eq 'showresv'
&& !$showresv;
next if $$menuitem[4] eq 'whn'
&& !$canviewwnew;
- next if $$menuitem[4] eq 'params'
- && (!$canmodpara && !$canviewpara);
- next if $$menuitem[4] eq 'nvcg'
- && ($canviewgrps || !$grouptools);
+ next if $$menuitem[4] eq 'opa'
+ && !$canmodpara;
+ next if $$menuitem[4] =~ /showgroups$/
+ && !$canviewgrps
+ && !$grouptools;
next if $$menuitem[4] eq 'showsyllabus'
&& !$showsyllabus;
next if $$menuitem[4] eq 'showfeeds'
&& !$showfeeds;
- next if $$menuitem[4] eq 'plc'
- && !$canplc;
next if $$menuitem[4] eq 'author'
&& !$author;
next if $$menuitem[4] eq 'cca'
&& !$canmodifycoauthor;
- next if $$menuitem[4] eq 'notltimapres'
- && $ltimapres;
- next if $$menuitem[4] eq 'notlti'
- && $lti;
- next if $$menuitem[4] eq 'lti'
- && (!$lti || !$noprimary);
- next if $$menuitem[3] eq 'Logout'
- && $ltiexc{'logout'};
- my $title = $menuitem->[3];
- if ($env{'request.course.id'} && $menucoll) {
- if ($$menuitem[5] eq 'main') {
- next if ($menuopts{$$menuitem[5]} eq 'n');
- } elsif ($$menuitem[5] ne 'roles') {
- next if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]}));
- }
- }
- if (defined($secondary_submenu{$title})) {
- my $link;
- if ($menuitem->[0] ne '') {
- $link = $menuitem->[0];
- } else {
- $link = '#';
- }
- my @scndsub;
- if (ref($secondary_submenu{$title}) eq 'ARRAY') {
- foreach my $item (@{$secondary_submenu{$title}}) {
- if (ref($item) eq 'ARRAY') {
- next if ($item->[2] eq 'vgr' && !$canvgr);
- next if ($item->[2] eq 'opa' && !$canmodpara);
- next if ($item->[2] eq 'vpa' && !$canviewpara);
- next if ($item->[2] eq 'viewusers' && !($canmodifyuser || $canviewusers));
- next if ($item->[2] eq 'mgr' && !$canmgr);
- next if ($item->[2] eq 'vcg' && !$canviewgrps);
- next if ($item->[2] eq 'crsedit' && !$canedit && !$canvieweditor);
- next if ($item->[2] eq 'params' && !$canmodpara && !$canviewpara);
- next if ($item->[2] eq 'author' && !$author);
- next if ($item->[2] eq 'cca' && !$canmodifycoauthor);
- next if ($item->[2] eq 'lti' && !$lti);
- if ($item->[2] =~ /^lti(portfolio|wishlist|blog)$/) {
- my $tool = $1;
- next if !$lti;
- next if (!&Apache::lonnet::usertools_access('','',$tool,
- undef,'tools'));
- }
- push(@scndsub,$item);
- }
- }
- if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'}) {
- unless ($ltiexc{'fullname'}) {
- $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
- }
- }
- if (@scndsub > 0) {
- $menu .= &create_submenu($link,$target,&mt($title),\@scndsub,1,undef,
- $listclass,$linkattr);
- } elsif ($link ne '#') {
- $menu .= ($listclass?'':' ').
- ''.
- &mt($title).' ';
- }
- }
- } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
+ if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
# special treatment for role selector
- my ($switcher,$has_opa_priv);
- ($roleswitcher_js,$roleswitcher_form,$switcher,$has_opa_priv) =
+ ($roleswitcher_js,$roleswitcher_form,my $switcher) =
&roles_selector(
$env{'course.' . $env{'request.course.id'} . '.domain'},
$env{'course.' . $env{'request.course.id'} . '.num'},
- $httphost,$target,$menucoll,$menuref
+ $httphost
);
- if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]})) {
- next unless ($has_opa_priv);
- }
$menu .= $switcher;
} else {
if ($$menuitem[3] eq 'Syllabus' && $env{'request.course.id'}) {
my $url = $$menuitem[0];
$url =~ s{\[cdom\]/\[cnum\]}{$cdom/$cnum};
if (&Apache::lonnet::is_on_map($url)) {
- unless ($$menuitem[0] =~ /(\?|\&)register=1/) {
- $$menuitem[0] .= (($$menuitem[0]=~/\?/)? '&' : '?').'register=1';
+ unless ($$menuitem[0] =~ /\?register=1/) {
+ $$menuitem[0] .= '?register=1';
}
} else {
- $$menuitem[0] =~ s{\&?register=1}{};
+ $$menuitem[0] =~ s{\?register=1}{};
}
- if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) {
- if (($ENV{'SERVER_PORT'} == 443) || ($env{'request.use_absolute'} =~ m{^https://})) {
- unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) {
- unless ($$menuitem[0] =~ m{^https?://}) {
- $$menuitem[0] = 'http://'.$ENV{'SERVER_NAME'}.$$menuitem[0];
- }
- unless ($$menuitem[0] =~ /(\&|\?)usehttp=1/) {
- $$menuitem[0] .= (($$menuitem[0]=~/\?/) ? '&' : '?').'usehttp=1';
- }
- }
- }
- }
- $$menuitem[0] = &HTML::Entities::encode($$menuitem[0],'&<>"');
}
- $menu .= &prep_menuitem(\@$menuitem,$target,$listclass,$linkattr);
+ $menu .= &prep_menuitem(\@$menuitem);
}
}
if ($menu =~ /\[url\].*\[symb\]/) {
@@ -739,14 +514,13 @@ sub secondary_menu {
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
($escurl = $env{'request.filename'}) =~ s{^\Q$londocroot\E}{};
$escurl = &escape($escurl);
- }
+ }
$menu =~ s/\[url\]/$escurl/g;
$menu =~ s/\[symb\]/$escsymb/g;
}
$menu =~ s/\[uname\]/$$author{user}/g;
$menu =~ s/\[udom\]/$$author{dom}/g;
- $menu =~ s/\[javascript\]/javascript:/g;
- if ($env{'request.course.id'}) {
+ if ($showsyllabus || $showfeeds) {
$menu =~ s/\[cnum\]/$cnum/g;
$menu =~ s/\[cdom\]/$cdom/g;
}
@@ -760,14 +534,14 @@ sub secondary_menu {
}
sub create_submenu {
- my ($link,$target,$title,$submenu,$translate,$addclass,$listclass,$linkattr) = @_;
+ my ($link,$target,$title,$submenu,$translate) = @_;
return unless (ref($submenu) eq 'ARRAY');
- my $targetattr;
- if (($target ne '') && ($link ne '#')) {
- $targetattr = ' target="'.$target.'"';
+ my $disptarget;
+ if ($target ne '') {
+ $disptarget = ' target="'.$target.'"';
}
- my $menu = ''.
- ''.
+ my $menu = ''.
+ ''.
''.$title.
''.
' ▼ '.
@@ -775,7 +549,7 @@ sub create_submenu {
# $link and $title are only used in the initial string written in $menu
# as seen above, not needed for nested submenus
- $menu .= &build_submenu($target, $submenu, $translate, '1', $listclass, $linkattr);
+ $menu .= &build_submenu($target, $submenu, $translate, '1');
$menu .= ' ';
return $menu;
@@ -785,8 +559,8 @@ sub create_submenu {
# build the dropdown (and nested submenus) recursively
# see perldoc create_submenu documentation for further information
sub build_submenu {
- my ($target, $submenu, $translate, $first_level, $listclass, $linkattr) = @_;
- unless (@{$submenu}) {
+ my ($target, $submenu, $translate, $first_level) = @_;
+ if (!defined(@{$submenu})) {
return '';
}
@@ -818,43 +592,24 @@ sub build_submenu {
if (ref($href) eq 'ARRAY') {
$menu .= '';
$menu .= '
';
+ . $title . '';
$menu .= '';
$menu .= &build_submenu($target, $href, $translate);
$menu .= ' ';
- $menu .= ' ';
+ $menu .= ' ';
} else { # href is the actual hyperlink and does not represent another submenu
# for the current menu title
if ($href =~ /(aboutme|rss\.html)$/) {
next unless (($env{'user.name'} ne '') && ($env{'user.domain'} ne ''));
$href =~ s/\[domain\]/$env{'user.domain'}/g;
$href =~ s/\[user\]/$env{'user.name'}/g;
- } elsif (($href =~ m{^/adm/preferences\?}) && ($href =~ /\[returnurl\]/)) {
- my $returnurl = $ENV{'REQUEST_URI'};
- if ($ENV{'REQUEST_URI'} =~ m{/adm/preferences\?action=(?:changedomcoord|authorsettings)\&returnurl=([^\&]+)$}) {
- $returnurl = $1;
- }
- if (($returnurl =~ m{^/adm/createuser($|\?action=)}) ||
- ($returnurl =~ m{^/priv/$match_domain/$match_username}) ||
- ($returnurl =~ m{^/res(/?$|/$match_domain/$match_username)})) {
- $returnurl =~ s{\?.*$}{};
- $returnurl = '&returnurl='.&HTML::Entities::encode($returnurl,'"<>&\'');
- } else {
- undef($returnurl);
- }
- $href =~ s/\[returnurl\]/$returnurl/;
}
- my $targetattr;
unless (($href eq '') || ($href =~ /^\#/)) {
- if ($target ne '') {
- $targetattr = ' target="'.$target.'"';
- }
+ $target = ' target="_top"';
}
- $menu .= '';
- $menu .= '' . $title . ' ';
+ $menu .= ' ';
+ $menu .= '' . $title . ' ';
$menu .= ' ';
}
}
@@ -862,37 +617,8 @@ sub build_submenu {
return $menu;
}
-sub registerurl {
- my ($forcereg) = @_;
- my $result = '';
- if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
- my $force_title='';
- if ($env{'request.state'} eq 'construct') {
- $force_title=&Apache::lonxml::display_title();
- }
- if (($env{'environment.remote'} ne 'on') ||
- ((($env{'request.publicaccess'}) ||
- (!&Apache::lonnet::is_on_map(
- &unescape($env{'request.noversionuri'})))) &&
- (!$forcereg))) {
- return
- $result
- .''
- .$force_title;
- }
-# Graphical display after login only
- if ($env{'request.registered'} && !$forcereg) { return ''; }
- $result.=&innerregister($forcereg);
- return $result.$force_title;
-}
-
sub innerregister {
- my ($forcereg,$bread_crumbs,$group,$pagebuttonshide,$hostname,
- $ltiscope,$ltiuri,$showncrumbsref) = @_;
+ my ($forcereg,$bread_crumbs,$group) = @_;
my $const_space = ($env{'request.state'} eq 'construct');
my $is_const_dir = 0;
@@ -900,72 +626,41 @@ sub innerregister {
$env{'request.registered'} = 1;
- my $noremote = ($env{'environment.remote'} ne 'on');
-
undef(@inlineremote);
- my $reopen=&Apache::lonmenu::reopenmenu();
-
- my $newmail='';
-
- if (&Apache::lonmsg::newmail() && !$noremote) {
- # We have new mail and remote is up
- $newmail= 'swmenu.setstatus("you have","messages");';
- }
-
- my ($mapurl,$resurl,$crstype,$navmap);
+ my ($mapurl,$resurl,$crstype);
if ($env{'request.course.id'}) {
#
-#course_type: Course or Community
+#course_type: Course, Community, or Placement
#
$crstype = &Apache::loncommon::course_type();
if ($env{'request.symb'}) {
- my $ignorenull;
- unless ($env{'request.noversionuri'} eq '/adm/navmaps') {
- $ignorenull = 1;
- }
- my $symb = &Apache::lonnet::symbread('','',$ignorenull);
- ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb($symb);
+ ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
my $maptitle = &Apache::lonnet::gettitle($mapurl);
- my $restitle = &Apache::lonnet::gettitle($symb);
-
- my (@crumbs,@mapcrumbs);
- if (($env{'request.noversionuri'} ne '/adm/navmaps') && ($mapurl ne '')) {
- unless ($ltiscope eq 'resource') {
- if (($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) &&
- !(($ltiscope eq 'map') && (&Apache::lonnet::clutter($resurl) eq $ltiuri))) {
- $navmap = Apache::lonnavmaps::navmap->new();
- if (ref($navmap)) {
- @mapcrumbs = $navmap->recursed_crumbs($mapurl,$restitle);
- }
- }
- }
- }
- unless (($ltiscope eq 'map') || ($ltiscope eq 'resource')) {
+ my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
+ my @crumbs;
+ unless (($forcereg) &&
+ ($env{'request.noversionuri'} eq '/adm/navmaps') &&
+ ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) ||
+ (($crstype eq 'Placement') && (!$env{'request.role.adv'}))) {
@crumbs = ({text => $crstype.' Contents',
href => "Javascript:gopost('/adm/navmaps','')"});
}
if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) {
- if (@mapcrumbs) {
- push(@crumbs,@mapcrumbs);
- } elsif (($ltiscope ne 'map') && ($ltiscope ne 'resource')) {
- push(@crumbs, {text => '...',
- no_mt => 1});
- }
+ push(@crumbs, {text => '...',
+ no_mt => 1});
}
- unless ((@mapcrumbs) || (!$maptitle) || ($maptitle eq 'default.sequence') ||
- ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) ||
- ($ltiscope eq 'resource')) {
- push @crumbs, {text => $maptitle, no_mt => 1,
- href => &Apache::lonnet::clutter($mapurl).'?navmap=1'};
- }
- if ($restitle && !@mapcrumbs) {
- push(@crumbs,{text => $restitle, no_mt => 1});
+ unless (($crstype eq 'Placement') || (!$env{'request.role.adv'})) {
+ push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle
+ && $maptitle ne 'default.sequence'
+ && $maptitle ne $coursetitle);
}
+
+ push @crumbs, {text => $restitle, no_mt => 1} if $restitle;
my @tools;
if ($env{'request.filename'} =~ /\.page$/) {
my %breadcrumb_tools = &Apache::lonhtmlcommon::current_breadcrumb_tools();
@@ -988,51 +683,27 @@ sub innerregister {
if ($env{'form.title'}) {
$title = $env{'form.title'};
}
- my ($trail,$cnum,$cdom);
- 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 $trail;
if ($env{'form.folderpath'}) {
- &prepare_functions($resurl,$forcereg,$group,undef,undef,1,$hostname);
- $title = &HTML::Entities::encode($title,'\'"<>&');
+ &prepare_functions($resurl,$forcereg,$group,undef,undef,1);
($trail) =
- &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
} else {
&Apache::lonhtmlcommon::add_breadcrumb(
{text => "Supplemental $crstype Content",
href => "javascript:gopost('/adm/supplemental','')"});
- $title = &HTML::Entities::encode(&mt('View Resource'),'\'"<>&');
- ($trail) =
- &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
- }
- if (ref($showncrumbsref)) {
- $$showncrumbsref = 1;
+ $title = &mt('View Resource');
+ ($trail) =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
}
return $trail;
} elsif ($resurl =~ m{^\Q/uploaded$courseurl/portfolio/syllabus/}) {
&Apache::lonhtmlcommon::clear_breadcrumbs();
&prepare_functions('/public'.$courseurl."/syllabus",
- $forcereg,$group,undef,undef,1,$hostname);
- $title = &HTML::Entities::encode(&mt('Syllabus File'),'\'"<>&');
- my ($trail) =
- &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
- if (ref($showncrumbsref)) {
- $$showncrumbsref = 1;
- }
- return $trail;
- } elsif (($resurl eq '/public'.$courseurl.'/syllabus') &&
- ($env{'form.folderpath'})) {
- if ($env{'form.title'}) {
- $title = $env{'form.title'};
- } else {
- $title = 'Syllabus';
- }
- &prepare_functions($resurl,$forcereg,$group,undef,undef,1,$hostname);
- $title = &HTML::Entities::encode($title,'\'"<>&');
+ $forcereg,$group,undef,undef,1);
+ $title = &mt('Syllabus File');
my ($trail) =
- &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
return $trail;
}
unless ($env{'request.state'} eq 'construct') {
@@ -1048,201 +719,83 @@ sub innerregister {
&Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
}
}
- my $timesync = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' );
# =============================================================================
# ============================ This is for URLs that actually can be registered
- if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/})
- || ($forcereg)) {
-
- my %swtext;
- if ($noremote) {
- %swtext = &get_inline_text();
- } else {
- %swtext = &get_rc_text();
- }
- my $hwkadd='';
-
- my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,
- $forceview,$editbutton);
- if (($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) ||
- ($env{'request.role'} !~/^(aa|ca|au)/)) {
- if (($env{'environment.remote'} eq 'on') && ($env{'request.symb'})) {
- &Apache::lonhtmlcommon::clear_breadcrumbs();
- }
- $editbutton = &prepare_functions($resurl,$forcereg,$group,'','','',$hostname);
- }
- if ($editbutton eq '') {
- $editbutton = &clear(6,1);
- }
+ return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/})
+ || $forcereg );
+ my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,
+ $forceview,$editbutton);
+ if (($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) ||
+ ($env{'request.role'} !~/^(aa|ca|au)/)) {
+ $editbutton = &prepare_functions($resurl,$forcereg,$group);
+ }
+ if ($editbutton eq '') {
+ $editbutton = &clear(6,1);
+ }
#
# This applies in course context
#
- if ($env{'request.course.id'}) {
- $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
- $perms{'cev'} = &Apache::lonnet::allowed('cev',$env{'request.course.id'});
- my @privs;
- my $gradable_exttool;
- if ($env{'request.symb'} ne '') {
- if ($env{'request.noversionuri'} =~ m{^/adm/$cdom/$cnum/(\d+)/ext\.tool$}) {
- if (&Apache::lonnet::EXT('resource.0.gradable') =~ /^yes$/i) {
- $gradable_exttool = 1;
- push(@privs,('mgr','vgr'));
- }
- } elsif ($env{'request.filename'}=~/$LONCAPA::assess_re/) {
- push(@privs,('mgr','vgr'));
- }
- push(@privs,('opa','vpa'));
- }
- foreach my $priv (@privs) {
- $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'});
- if (!$perms{$priv} && $env{'request.course.sec'} ne '') {
- $perms{$priv} =
- &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}");
- }
+ if ($env{'request.course.id'}) {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+ my @privs;
+ if ($env{'request.symb'} ne '') {
+ if ($env{'request.filename'}=~/$LONCAPA::assess_re/) {
+ push(@privs,('mgr','vgr'));
+ }
+ push(@privs,'opa');
+ }
+ foreach my $priv (@privs) {
+ $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'});
+ if (!$perms{$priv} && $env{'request.course.sec'} ne '') {
+ $perms{$priv} =
+ &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}");
}
+ }
#
# Determine whether or not to show Grades and Submissions buttons
#
- if (($env{'request.symb'} ne '') &&
- (($env{'request.filename'}=~/$LONCAPA::assess_re/) || ($gradable_exttool))) {
- if ($perms{'mgr'}) {
- $hwkadd.= &switch('','',7,2,'pgrd.png','Content Grades',
- 'grades[_4]',
- "gocmd('/adm/grades','gradingmenu')",
- 'Content Grades');
- } elsif ($perms{'vgr'}) {
- $hwkadd .= &switch('','',7,2,'subm.png','Content Submissions',
- 'missions[_1]',
- "gocmd('/adm/grades','submission')",
- 'Content Submissions');
- }
- }
- if (($env{'request.symb'} ne '') && (($perms{'opa'}) || ($perms{'vpa'}))) {
- $hwkadd .= &switch('','',7,3,'pparm.png','Content Settings',
- 'parms[_2]',"gocmd('/adm/parmset','set')",
- 'Content Settings');
- }
+ if ($env{'request.symb'} ne '' &&
+ $env{'request.filename'}=~/$LONCAPA::assess_re/) {
+ if ($perms{'mgr'}) {
+ &switch('','',7,2,'pgrd.png','Content Grades','grades[_4]',
+ "gocmd('/adm/grades','gradingmenu')",
+ 'Content Grades');
+ } elsif ($perms{'vgr'}) {
+ &switch('','',7,2,'subm.png','Content Submissions','missions[_1]',
+ "gocmd('/adm/grades','submission')",
+ 'Content Submissions');
+ }
+ }
+ if (($env{'request.symb'} ne '') && ($perms{'opa'})) {
+ &switch('','',7,3,'pparm.png','Content Settings','parms[_2]',
+ "gocmd('/adm/parmset','set')",
+ 'Content Settings');
+ }
# End grades/submissions check
#
# This applies to items inside a folder/page modifiable in the course.
#
- if (($env{'request.symb'}=~/^uploaded/) && (($perms{'mdc'}) || ($perms{'cev'}))) {
- my $text = 'Edit Folder';
- if (($mapurl =~ /\.page$/) ||
- ($env{'request.symb'}=~
- m{uploaded/$cdom/$cnum/default_\d+\.page$})) {
- $text = 'Edit Page';
- }
- $hwkadd .= &switch('','',7,4,'docs-22x22.png',$text,'parms[_2]',
- "gocmd('/adm/coursedocs','direct')",
- 'Folder/Page Content');
- }
-# End modifiable folder/page container check
-
-#
-# Determine whether to show View As button for shortcut to display problem, answer, and submissions
-#
-
- if (($env{'request.symb'} ne '') &&
- ($env{'request.filename'}=~/$LONCAPA::assess_re/) &&
- (($perms{'mgr'}) || ($perms{'vgr'}))) {
- my ($viewas,$text,$change,$visibility,$vuname,$vudom,$vid,$leftvis,$defdom,
- $domselector,$righticon);
- my %lt = &Apache::lonlocal::texthash(
- view => 'View',
- upda => 'Update',
- );
- my $possdomstr = $env{'course.'.$env{'request.course.id'}.'.internal.userdomains'};
- if ($possdomstr =~ /,/) {
- my @possdoms = split(/,/,$possdomstr);
- if ($env{'request.user_in_effect'} =~ /^$match_username:($match_domain)$/) {
- $defdom = $1;
- } elsif (grep(/^\Q$cdom\E$/,@possdoms)) {
- $defdom = $cdom;
- } elsif (&Apache::lonnet::domain($possdoms[0]) ne '') {
- $defdom = $possdoms[0];
- }
- $domselector = &Apache::loncommon::select_dom_form($defdom,'vudom','','','',\@possdoms);
- } elsif (($possdomstr ne '') && (&Apache::lonnet::domain($possdomstr) ne '')) {
- if ($env{'request.user_in_effect'} =~ /^$match_username:($match_domain)$/) {
- $defdom = $1;
- } else {
- $defdom = $possdomstr;
- }
- }
- if ($env{'request.user_in_effect'} =~ /^($match_username):($match_domain)$/) {
- ($vuname,$vudom) = ($1,$2);
- unless (&Apache::lonnet::is_advanced_user($vudom,$vuname)) {
- $vid = (&Apache::lonnet::idrget($vudom,$vuname))[1];
- }
- $viewas = $env{'request.user_in_effect'};
- $text = $lt{'upda'};
- $change = 'off';
- $visibility = 'inline';
- $leftvis = 'none';
- $defdom = $vudom;
- $righticon = '✖';
- } else {
- $text = $lt{'view'};
- $change = 'on';
- $visibility = 'none';
- $leftvis = 'inline';
- if ($defdom eq '') {
- $defdom = $cdom;
- }
- }
- my $sellink = &Apache::loncommon::selectstudent_link('userview','vuname','vudom','','','vuidentifier');
- my $selscript=&Apache::loncommon::studentbrowser_javascript();
- my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($env{'request.symb'}),'<>&"');
- my $input;
- my @items = (
- ' ',
- ' ',
- ' ',
- ' '
- );
- if ($domselector) {
- push(@items,$domselector);
- $input = &mt('[_1]User:[_2] or [_3]ID:[_4] at [_5] | ',@items);
- } else {
- $input = &mt('[_1]Username:[_2] or [_3]ID:[_4] | ',@items).
- ' ';
- }
- $input .= ' ',
- ' ';
- my $chooser = <