--- loncom/interface/lonmenu.pm 2010/01/18 21:58:59 1.244.2.13
+++ loncom/interface/lonmenu.pm 2010/01/06 18:19:59 1.309.2.9
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.244.2.13 2010/01/18 21:58:59 raeburn Exp $
+# $Id: lonmenu.pm,v 1.309.2.9 2010/01/06 18:19:59 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,15 +26,10 @@
# http://www.lon-capa.org/
#
#
-# There are two parameters controlling the action of this module:
-#
-# browser.interface - if this is 'textual', it overrides the second parameter
-# and goes to screen reader PDA mode
+# There is one parameter controlling the action of this module:
#
# environment.remote - if this is 'on', the routines controll the remote
-# control, otherwise they render the main window controls; ignored it
-# browser.interface is 'textual'
-#
+# control, otherwise they render the main window controls;
=head1 NAME
@@ -51,8 +46,6 @@ described at http://www.lon-capa.org.
=over
-=item show_course()
-
Little texts
=item initlittle()
@@ -141,30 +134,202 @@ 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) = @_;
+ 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;
+ my $custommenu = &Apache::loncommon::needs_gci_custom();
+ # 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 ref($menuitem) ne 'ARRAY'; #
+ 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' # hide links which are
+ && $custommenu; # not visible when GCI
+ next if $$menuitem[4] eq 'courses' # tabbed interface in use
+ && $custommenu; #
+ 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 {
+ my @items = @{$menuitem};
+ $items[0] = 'javascript:'.$menuitem->[0].';';
+ $menu .= &prep_menuitem(\@items);
+ }
+ }
+ return "";
+}
-sub show_course {
- my $course = !$env{'user.adv'};
- if (!$env{'user.adv'}) {
- foreach my $env (keys(%env)) {
- next if ($env !~ m/^user\.priv\./);
- if ($env !~ m/^user\.priv\.(?:st|cm)/) {
- $course = 0;
- last;
- }
- }
+
+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 ref($menuitem) ne 'ARRAY';
+ 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] =~ /^(no|)remotenav$/
+ && $crstype eq 'Community';
+ next if $$menuitem[4] =~ /^(no|)remotenavCommunity$/
+ && $crstype ne 'Community';
+ 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"
+ : '';
+ } elsif ($env{'environment.remotenavmap'} eq 'on') {
+ # open link using javascript when remote navmap is activated
+ my @items = @{$menuitem};
+ if ($menuitem->[4] eq 'remotenav') {
+ $items[0] = "javascript:gonav('$menuitem->[0]');";
+ } else {
+ $items[0] = "javascript:go('$menuitem->[0]');";
+ }
+ $menu .= &prep_menuitem(\@items);
+ } 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 $course;
+
+ return "";
}
+sub gci_secondary_menu {
+ my %courses = (
+ 'review' => 'gci_9615072b469884921gcil1',
+ 'submit' => 'gci_1H96711d710194bfegcil1',
+ );
+ my %linktext = (
+ 'review' => 'Review Questions',
+ 'submit' => 'Submit Questions',
+ 'managetest' => 'Manage Tests',
+ );
+ my %links = (
+ 'managetest' => '/adm/menu',
+ );
+ my $current = 'managetest';
+ if ($env{'form.destinationurl'} eq '/adm/gci_info') {
+ undef($current);
+ }
+ foreach my $key (keys(%courses)) {
+ $links{$key} = "javascript:switchpage('$key');";
+ if ($env{'request.course.id'} eq $courses{$key}) {
+ $links{$key} = '/adm/navmaps';
+ $current = $key;
+ $links{'managetest'} = '/adm/roles?selectrole=1&cm=1&orgurl=%2fadm%2fmenu';
+ }
+ }
+ my @menutabs = ('review','submit','managetest');
+ my $tabs;
+ foreach my $item (@menutabs) {
+ if ($item eq $current) {
+ $tabs .= ' '.
+ $linktext{$item}.'';
+ } else {
+ $tabs .= ' '.
+ $linktext{$item}.'';
+ }
+ }
+ 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'),
@@ -178,10 +343,14 @@ sub initlittle {
);
}
+#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 $registration=shift;
my $titletable=shift;
+#
+# Early-out for pages that should not have a menu, triggered by query string "inhibitmenu=yes"
+#
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['inhibitmenu']);
if (($env{'form.inhibitmenu'} eq 'yes') ||
@@ -198,14 +367,20 @@ sub menubuttons {
my $role_selector;
my $showgroups=0;
my ($cnum,$cdom);
+#
+# if the URL is hidden, symbs and the non-versioned version of the URL would be encrypted
+#
my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));
my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));
my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");
- $logo = ' | ';
+ $logo = '';
if ($env{'request.state'} eq 'construct') {
+#
+# We are in construction space
+#
if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {
my $returnurl = $env{'request.filename'};
$returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:;
@@ -213,6 +388,9 @@ sub menubuttons {
}
}
if ($env{'request.course.id'}) {
+#
+# We are in a course
+#
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my %coursegroups;
@@ -230,78 +408,28 @@ sub menubuttons {
}
}
- if ($env{'browser.interface'} eq 'textual') {
-# Textual display only
- if ($env{'request.course.id'}) {
- $navmaps=(<$lt{'nav'}
-ENDNAV
- if (&show_return_link()) {
- my $escreload=&escape('return:');
- $reloadlink=(<$lt{'ret'}
-ENDRELOAD
- }
- my $is_community =
- (&Apache::loncommon::course_type() eq 'Community');
- if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
- my $text = ($is_community) ? $lt{'gdoc'} : $lt{'docs'};
- $docs=(<$text
-ENDDOCS
- }
- if ($showgroups) {
- $groups =(<$lt{'groups'}
-ENDGROUPS
- }
- }
- my $form=&serverform();
- my $utility=&utilityfunctions();
- my $output=(<
-// BEGIN LON-CAPA Internal
-$utility
-
-
-
-
-$form
-ENDMAINMENU
- if ($registration) { $output.=&innerregister($forcereg); }
- return $output."
";
- } elsif ($env{'environment.remote'} eq 'off') {
+ if ($env{'environment.remote'} eq 'off') {
# Remote Control is switched off
# figure out colors
- my %lt=&initlittle();
+ my %lt=&initlittle();
my $domain=&Apache::loncommon::determinedomain();
- my $function =&Apache::loncommon::get_users_function();
+ my $function=&Apache::loncommon::get_users_function();
my $link=&Apache::loncommon::designparm($function.'.link',$domain);
my $alink=&Apache::loncommon::designparm($function.'.alink',$domain);
my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain);
my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain);
- if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
- return (<
-
- $logo
- |
-
- $lt{'login'}
- |
-
-
-
+
+ if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
+ return (<