--- loncom/interface/lonmenu.pm 2009/08/12 18:38:04 1.279
+++ loncom/interface/lonmenu.pm 2009/10/16 20:22:06 1.290
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.279 2009/08/12 18:38:04 raeburn Exp $
+# $Id: lonmenu.pm,v 1.290 2009/10/16 20:22:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -113,11 +113,6 @@ The javascript is usually similar to "go
=item get_nav_status()
-=item convert_menu_function()
-
-FIXME this needs to move into mydesktab and the other locations
-the text is generated
-
=item hidden_button_check()
=item roles_selector()
@@ -137,19 +132,144 @@ use Apache::loncommon();
use Apache::lonenc();
use Apache::lonlocal;
use LONCAPA qw(:DEFAULT :match);
+use HTML::Entities();
-use vars qw(@desklines %category_names %category_members %category_positions $readdesk);
+use vars qw(@desklines %category_names %category_members %category_positions
+ $readdesk @primary_menu @secondary_menu);
my @inlineremote;
+sub prep_menuitem {
+ my $menuitem = shift;
+ return '' unless ref $menuitem eq 'ARRAY';
+ my $link;
+ if ($$menuitem[1]) { # graphical Link
+ $link = "";
+ } else { # textual Link
+ $link = mt($$menuitem[3]);
+ }
+ return "
$link";
+}
+
+# primary_menu() evaluates @primary_menu and returns XHTML for the menu
+# that contains following links:
+# About, Message, Roles, Help, Logout
+# @primary_menu is filled within the BEGIN block of this module with
+# entries from mydesk.tab
+sub primary_menu {
+ my $menu;
+ # each element of @primary contains following array:
+ # (link url, icon path, alt text, link text, condition)
+ foreach my $menuitem (@primary_menu) {
+ # evaluate conditions
+ next if $$menuitem[4] eq 'nonewmsg' # show links depending on
+ && Apache::lonmsg::mynewmail(); # whether a new msg
+ next if $$menuitem[4] eq 'newmsg' # arrived or not
+ && !Apache::lonmsg::mynewmail(); #
+ next if $$menuitem[4] !~ /public/ ##we've a public user,
+ && $env{'user.name'} eq 'public' ##who should not see all
+ && $env{'user.domain'} eq 'public'; ##links
+ next if $$menuitem[4] eq 'onlypublic'# hide links which are
+ && $env{'user.name'} ne 'public' # only visible to public
+ && $env{'user.domain'} ne '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(); ##
+
+
+ if ($$menuitem[3] eq 'Help') { # special treatment for helplink
+ $menu .= ''.Apache::loncommon::top_nav_help('Help').'';
+ } else {
+ $menu .= prep_menuitem(\@$menuitem);
+ }
+ }
+
+ return "";
+}
+
+
+sub secondary_menu {
+ my $menu;
+
+ my $crstype = &Apache::loncommon::course_type();
+ my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
+ my $canviewgrps = &Apache::lonnet::allowed('vcg', $env{'request.course.id'}
+ . ($env{'request.course.sec'} ? "/$env{'request.course.sec'}"
+ : ''));
+ my $showlink = &show_return_link();
+ my %groups = &Apache::lonnet::get_active_groups(
+ $env{'user.domain'}, $env{'user.name'},
+ $env{'course.' . $env{'request.course.id'} . '.domain'},
+ $env{'course.' . $env{'request.course.id'} . '.num'});
+ foreach my $menuitem (@secondary_menu) {
+ # evaluate conditions
+ next if $$menuitem[4] ne 'always'
+ && !$env{'request.course.id'};
+ next if $$menuitem[4] eq 'showreturn'
+ && !$showlink
+ && !($env{'request.state'} eq 'construct');
+ next if $$menuitem[4] =~ /^mdc/
+ && !$canedit;
+ next if $$menuitem[4] eq 'mdcCourse'
+ && $crstype eq 'Community';
+ next if $$menuitem[4] eq 'mdcCommunity'
+ && $crstype ne 'Community';
+ next if $$menuitem[4] =~ /^remotenav/
+ && $env{'environment.remotenavmap'} ne 'on';
+ next if $$menuitem[4] =~ /noremotenav/
+ && $env{'environment.remotenavmap'} eq 'on';
+ next if $$menuitem[4] =~ /showgroups$/
+ && $canviewgrps
+ && !%groups;
+
+ if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
+ # special treatment for role selector
+ my $roles_selector = roles_selector(
+ $env{'course.' . $env{'request.course.id'} . '.domain'},
+ $env{'course.' . $env{'request.course.id'} . '.num'} );
+
+ $menu .= $roles_selector ? "$roles_selector"
+ : '';
+ } else {
+ $menu .= prep_menuitem(\@$menuitem);
+ }
+ }
+ if ($menu =~ /\[url\].*\[symb\]/) {
+ my $escurl = escape( Apache::lonenc::check_encrypt(
+ $env{'request.noversionuri'}));
+
+ my $escsymb = escape( Apache::lonenc::check_encrypt(
+ $env{'request.symb'}));
+
+ if ( $env{'request.state'} eq 'construct'
+ and ( $env{'request.noversionuri'} eq ''
+ || !defined($env{'request.noversionuri'})))
+ {
+ ($escurl = $env{'request.filename'}) =~
+ s{^/home/([^/]+)/public_html/(.*)$}{/priv/$1/$2};
+
+ $escurl = escape($escurl);
+ }
+ $menu =~ s/\[url\]/$escurl/g;
+ $menu =~ s/\[symb\]/$escsymb/g;
+ }
+
+ return "";
+}
+
+
#
# This routine returns a translated hash for the menu items in the top inline menu row
# Probably should be in mydesk.tab
+#SD this sub is deprecated - don't use it
sub initlittle {
return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',
- 'nav' => 'Navigate Contents',
+ 'nav' => 'Course Contents',
'main' => 'Main Menu',
'roles' => (&Apache::loncommon::show_course()?
'Courses':'Roles'),
@@ -159,10 +279,12 @@ sub initlittle {
'login' => 'Log In',
'launch' => 'Launch Remote Control',
'groups' => 'Groups',
- 'gdoc' => 'Group Documents',
+ 'gdoc' => 'Community Documents',
);
}
+#SD this sub is deprecated - don't use it
+#SD functionality is covered by new loncommon::bodytag and primary_menu(), secondary_menu()
sub menubuttons {
my $forcereg=shift;
my $titletable=shift;
@@ -240,7 +362,7 @@ sub menubuttons {
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
return (<