--- loncom/interface/lonmenu.pm 2009/05/08 16:08:56 1.263 +++ loncom/interface/lonmenu.pm 2010/12/02 13:07:08 1.309.2.20 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.263 2009/05/08 16:08:56 droeschl Exp $ +# $Id: lonmenu.pm,v 1.309.2.20 2010/12/02 13:07:08 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() @@ -120,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() @@ -143,34 +131,248 @@ use Apache::lonhtmlcommon(); use Apache::loncommon(); use Apache::lonenc(); use Apache::lonlocal; +use Apache::loncoursequeueadmin; 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]); + } + if($$menuitem[4] eq 'newmsg'){ #special style for New Messages + return '
  • '.$link.'
  • '; + } + 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(); + my $numdc = &Apache::loncommon::check_for_gci_dc(); + # each element of @primary contains following array: + # (link url, icon path, alt text, link text, condition) + my $public; + if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) + || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) { + $public = 1; + } + 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, + && $public; ##who should not see all + ##links + next if $$menuitem[4] eq 'onlypublic'# hide links which are + && !$public; # only visible to public + # users + next if $$menuitem[4] eq 'gci' + && (!$custommenu || $env{'request.role'} =~ m{^st\./gcitest/}); + next if $$menuitem[4] eq 'home' + && (($custommenu) || ($env{'user.domain'} eq 'gcitest') || + (($env{'user.domain'} eq 'gci') && !$numdc)); + next if $$menuitem[4] eq 'gcitest' + && (($env{'user.domain'} eq 'gci') || ($env{'request.role'} eq 'cm')); + 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 + if ($public) { + my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'}; + my $defdom = &Apache::lonnet::default_login_domain(); + my $to = &Apache::loncommon::build_recipient_list(undef, + 'helpdeskmail', + $defdom,$origmail); + if ($to ne '') { + $menu .= &prep_menuitem($menuitem); + } + } else { + $menu .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; + } + } else { + my @items = @{$menuitem}; + $items[0] = 'javascript:'.$menuitem->[0].';'; + $menu .= &prep_menuitem(\@items); + } + } + + return "
      $menu
    "; +} + + +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'}); + my $custommenu = &Apache::loncommon::needs_gci_custom(); + my $numdc = &Apache::loncommon::check_for_gci_dc(); + my $role = $env{'request.role'}; + foreach my $menuitem (@secondary_menu) { + # evaluate conditions + next if ref($menuitem) ne 'ARRAY'; + next if $$menuitem[4] eq 'showmenu' + && ($custommenu || (!$numdc && $role eq 'cm')); + next if $$menuitem[4] ne 'showmenu' + && $$menuitem[4] ne 'author' + && !$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; + next if $$menuitem[4] eq 'showroles' + && ($custommenu || !$numdc || ($numdc && $env{'request.noversionuri'} eq '/adm/roles')); + if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'} && !$custommenu) { + # 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'})); -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; - } - } + 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 ""; +} + +sub gci_secondary_menu { + my %courses = ( + 'review' => 'gci_9615072b469884921gcil1', + 'submit' => 'gci_1H96711d710194bfegcil1', + 'tutorial' => 'gci_5422913620b814c90gcil1', + ); + my %linktext = ( + 'review' => 'Review Questions', + 'submit' => 'Submit Questions', + 'managetest' => 'Manage Tests', + 'tutorial' => 'Tutorials', + ); + 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}) { + if ($env{'environment.remotenavmap'} eq 'on') { + $links{$key} = "javascript:gonav('/adm/navmaps')"; + } else { + $links{$key} = '/adm/navmaps'; + } + $current = $key; + $links{'managetest'} = '/adm/roles?selectrole=1&cm=1&orgurl=%2fadm%2fmenu'; + } + } + my @menutabs = ('review','submit','managetest','tutorial'); + my $tabs; + foreach my $item (@menutabs) { + if ($item eq $current) { + $tabs .= '
  • '. + $linktext{$item}.'
  • '; + } else { + $tabs .= '
  • '. + $linktext{$item}.'
  • '; + } } - return $course; + 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' => (&show_course()? + 'roles' => (&Apache::loncommon::show_course()? 'Courses':'Roles'), 'other' => 'Other Roles', 'docs' => 'Edit Course', @@ -178,14 +380,18 @@ 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 $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') || @@ -202,6 +408,9 @@ 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'})); @@ -210,6 +419,9 @@ sub menubuttons { $logo.'" alt="LON-CAPA Logo" class="LC_noBorder" />'; 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:; @@ -217,6 +429,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; @@ -234,71 +449,25 @@ 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 - } - if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - $docs=(<$lt{'docs'} -ENDDOCS - } - if ($showgroups) { - $groups =(<$lt{'groups'} -ENDGROUPS - } - } - my $form=&serverform(); - my $utility=&utilityfunctions(); - my $output=(< -// BEGIN LON-CAPA Internal -$utility - -
    -$lt{'main'} -$reloadlink $navmaps $docs $groups $roles -$lt{'exit'} -
    -
    - -$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 (< +
  • $logo
  • +
  • $lt{'login'}
  • + +
    ENDINLINEMENU } $roles = ''.$lt{'roles'}.''; @@ -312,9 +481,10 @@ ENDINLINEMENU $navmaps=(<$lt{'nav'} ENDNAV - my $is_group = (&Apache::loncommon::course_type() eq 'Group'); + my $is_community = + (&Apache::loncommon::course_type() eq 'Community'); if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'}; + my $text = ($is_community) ? $lt{'gdoc'} : $lt{'docs'}; $docs=(<$text ENDDOCS @@ -341,35 +511,31 @@ ENDRELOAD
  • $lt{'ret'}
  • ENDCRELOAD } - my $reg=''; - if ($registration) { - $reg=&innerregister($forcereg,$titletable); - } - my $form=&serverform(); - my $utility=&utilityfunctions(); - - my $messagelink = ""; - if(&Apache::lonmsg::mynewmail()){ - $messagelink = 'Message(new)' - }else{ - $messagelink = 'Message' - } - my $helplink=&Apache::loncommon::top_nav_help('Help'); + my $reg = $forcereg ? &innerregister($forcereg,$titletable) : ''; + my $form = &serverform(); + my $utility = &utilityfunctions(); + + #Prepare the message link that indicates the arrival of new mail + my $messagelink = &Apache::lonmsg::mynewmail() ? "Message (new)" : "Message"; + $messagelink = '' + . mt($messagelink) .''; + + my $helplink = &Apache::loncommon::top_nav_help('Help'); return (< -// BEGIN LON-CAPA Internal // -
      +
      1. $logo
      2. $messagelink
      3. $roles
      4. $helplink
      5. $lt{'exit'}
      -