--- loncom/interface/lonmenu.pm 2003/06/04 22:05:22 1.74 +++ loncom/interface/lonmenu.pm 2003/11/10 16:51:12 1.101 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.74 2003/06/04 22:05:22 www Exp $ +# $Id: lonmenu.pm,v 1.101 2003/11/10 16:51:12 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,12 +44,25 @@ use Apache::Constants qw(:common); use Apache::lonhtmlcommon(); use Apache::loncommon; use Apache::File; +use Apache::lonlocal; + use vars qw(@desklines $readdesk); + + my @inlineremote; my $font; my $tabbg; my $pgbg; +# ================================================================ Little texts + +sub initlittle { + return &Apache::lonlocal::texthash('ret' => 'Return to Last Location', + 'nav' => 'Navigate Contents', + 'main' => 'Main Menu', + 'launch' => 'Launch Remote Control'); +} + # ============================= This gets called at the top of the body section sub menubuttons { @@ -58,20 +71,24 @@ sub menubuttons { my $registration=shift; my $navmaps=''; my $reloadlink=''; - my $escurl=&Apache::lonnet::escape($ENV{'REQUEST_URI'}); + my $escurl=&Apache::lonnet::escape($ENV{'request.noversionuri'}); my $escsymb=&Apache::lonnet::escape($ENV{'request.symb'}); if ($ENV{'browser.interface'} eq 'textual') { # Textual display only + my %lt=&initlittle(); + $pgbg='#FFFFFF'; + $tabbg='#FFFFFF'; + $font='#000000'; if ($ENV{'request.course.id'}) { $navmaps=(<<ENDNAV); -<a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top">Navigate Contents</a> +<a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top">$lt{'nav'}</a> ENDNAV - if (($ENV{'REQUEST_URI'}=~/^\/adm\//) && - ($ENV{'REQUEST_URI'}!~/^\/adm\/wrapper\//) && - ($ENV{'REQUEST_URI'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) { + if (($ENV{'request.noversionuri'}=~/^\/adm\//) && + ($ENV{'request.noversionuri'}!~/^\/adm\/wrapper\//) && + ($ENV{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) { my $escreload=&Apache::lonnet::escape('return:'); $reloadlink=(<<ENDRELOAD); -<a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">Return to Last Location</font></a> +<a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">$lt{'ret'}</font></a> ENDRELOAD } } @@ -79,7 +96,7 @@ ENDRELOAD <script> // BEGIN LON-CAPA Internal </script> -<a href="/adm/menu" target="_top">Main Menu</a> +<a href="/adm/menu" target="_top">$lt{'main'}</a> $reloadlink $navmaps<br /> <script> // END LON-CAPA Internal @@ -90,6 +107,7 @@ ENDMAINMENU } elsif ($ENV{'environment.remote'} eq 'off') { # Remote Control is switched off # figure out colors + my %lt=&initlittle(); my $function='student'; if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) { $function='coordinator'; @@ -98,7 +116,7 @@ ENDMAINMENU $function='admin'; } if (($ENV{'request.role'}=~/^(au|ca)/) || - ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { + ($ENV{'request.noversionuri'}=~/^(\/priv|\~)/)) { $function='author'; } my $domain=&Apache::loncommon::determinedomain(); @@ -113,15 +131,15 @@ ENDMAINMENU if ($ENV{'request.course.id'}) { $navmaps=(<<ENDNAVREM); <td bgcolor="$tabbg"> -<a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top"><font color="$font">Navigate Contents</font></a></td> +<a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top"><font color="$font">$lt{'nav'}</font></a></td> ENDNAVREM - if (($ENV{'REQUEST_URI'}=~/^\/adm\//) && - ($ENV{'REQUEST_URI'}!~/^\/adm\/wrapper\//) && - ($ENV{'REQUEST_URI'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) { + if (($ENV{'request.noversionuri'}=~/^\/adm\//) && + ($ENV{'request.noversionuri'}!~/^\/adm\/wrapper\//) && + ($ENV{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) { my $escreload=&Apache::lonnet::escape('return:'); $reloadlink=(<<ENDRELOAD); <td bgcolor="$tabbg"> -<a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">Return to Last Location</font></a></td> +<a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">$lt{'ret'}</font></a></td> ENDRELOAD } } @@ -133,21 +151,22 @@ ENDRELOAD <script> // BEGIN LON-CAPA Internal </script> -<table bgcolor="$pgbg" width="100%" border="0" cellpadding="3" cellspacing="3"> +<font face="Arial,Helvetica,sans-serif"><table bgcolor="$pgbg" width="100%" border="0" cellpadding="1" cellspacing="1"> <tr> <td bgcolor="$tabbg"> -<a href="/adm/menu" target="_top"><font color="$font">Main Menu</font></a> +<a href="/adm/menu" target="_top"><font color="$font">$lt{'main'}</font></a> </td> $reloadlink $navmaps <td bgcolor="$tabbg"> <a href="/adm/remote?action=launch&url=$escurl" target="_top"> -<font color="$font">Launch Remote Control</font></a></td> +<font color="$font">$lt{'launch'}</font></a></td> <td bgcolor="$tabbg"> <img align="right" src="/adm/lonIcons/minilogo.gif" /> <b>LON-CAPA</b></td> </tr> </table> +</font> <script> // END LON-CAPA Internal </script> @@ -158,20 +177,13 @@ ENDINLINEMENU } } -# ===== Early call to LONCAPAreg for long-running pages, preferably used right -# ===== before $r->rflush() - -sub regflush { - return '<script type="text/javascript">'.&loadevents.'</script>'; -} - # ====================================== This gets called in the header section sub registerurl { my $forcereg=shift; my $target = shift; my $result = ''; - if ($ENV{'REQUEST_URI'} eq '/res/adm/pages/menu.html') { return ''; } + if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; } my $force_title=''; if ($ENV{'request.state'} eq 'construct') { $force_title=&Apache::lonxml::display_title(); @@ -185,36 +197,17 @@ sub registerurl { if (($ENV{'browser.interface'} eq 'textual') || ($ENV{'environment.remote'} eq 'off') || ((($ENV{'request.publicaccess'}) || - (!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) && + (!&Apache::lonnet::is_on_map( + &Apache::lonnet::unescape($ENV{'request.noversionuri'})))) && (!$forcereg))) { - my $loadfunction=''; - my $inlineloadfunction=''; - my $unloadfunction=''; - unless (($ENV{'browser.interface'} eq 'textual') || - ($ENV{'environment.remote'} eq 'off') || - ($ENV{'request.publicaccess'})) { - my $reopen=&Apache::lonmenu::reopenmenu(); - $loadfunction='swmenu='.$reopen.'swmenu.windowloaded(self.name);window.focus();'; - $inlineloadfunction=®flush(); - $unloadfunction='swmenu='.$reopen.'swmenu.windowunloaded(self.name);'; - } - return $result.(<<ENDFUNCTIONS); -<script type="text/javascript"> -function LONCAPAreg() { - $loadfunction -} - -function LONCAPAstale() { - $unloadfunction -} -</script> -$inlineloadfunction -$force_title -ENDFUNCTIONS + return $result. + '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'.$force_title; } # Graphical display after login only if ($Apache::lonxml::registered && !$forcereg) { return ''; } - $result.=&innerregister($forcereg,$target); + if ($target ne 'edit') { + $result.=&innerregister($forcereg,$target); + } return $result.$force_title; } @@ -225,7 +218,7 @@ sub innerregister { my $forcereg=shift; my $target = shift; my $result = ''; - if ($ENV{'REQUEST_URI'} eq '/res/adm/pages/menu.html') { return ''; } + if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; } $Apache::lonxml::registered=1; @@ -241,10 +234,10 @@ sub innerregister { my $newmail=''; if ($noremote) { - $newmail='<table bgcolor="'.$pgbg.'" border="0" cellspacing="3" cellpadding="3" width="100%"><tr><td bgcolor="'.$tabbg.'">'; + $newmail='<font face="Arial,Helvetica,sans-serif"><table bgcolor="'.$pgbg.'" border="0" cellspacing="1" cellpadding="1" width="100%"><tr><td bgcolor="'.$tabbg.'">'; } if (($textual) && ($ENV{'request.symb'}) && ($ENV{'request.course.id'})) { - my ($mapurl,$rid,$resurl)=split(/\_\_\_/,$ENV{'request.symb'}); + my ($mapurl,$rid,$resurl)=&Apache::lonnet::decode_symb($ENV{'request.symb'}); $newmail.=$ENV{'course.'.$ENV{'request.course.id'}.'.description'}; my $maptitle=&Apache::lonnet::gettitle($mapurl); my $restitle=&Apache::lonnet::gettitle($resurl); @@ -258,33 +251,39 @@ sub innerregister { } if (&Apache::lonmsg::newmail()) { $newmail=($textual? - '<b><a href="/adm/communicate">You have new messages</a></b><br />': + '<b><a href="/adm/communicate" target="_top">You have new messages</a></b><br />': 'swmenu.setstatus("you have","messages");'); } if ($noremote) { - $newmail.='</td></tr></table>'; + $newmail.='</td></tr></table></font>'; } my $timesync=($textual?'':'swmenu.syncclock(1000*'.time.');'); - my $tablestart=($noremote?'<table bgcolor="'.$pgbg.'" border="0" cellspacing="3" cellpadding="3" width="100%">':''); - my $tableend=($noremote?'</table>':''); + my $tablestart=($noremote?'<font face="Arial,Helvetica,sans-serif"><table bgcolor="'.$pgbg.'" border="0" cellspacing="1" cellpadding="1" width="100%">':'').($textinter?'<br /><a href="#content">'.&mt('Skip to Content').'</a><br />':''); + my $tableend=($noremote?'</table></font>':'').($textinter?'<a name="content" />':''); # ============================================================================= # ============================ This is for URLs that actually can be registered - if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { + if (($ENV{'request.noversionuri'}!~/^\/(res\/)*adm\//) || ($forcereg)) { # -- This applies to homework problems for users with grading privileges my $hwkadd=''; if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { - if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { - $hwkadd.=&switch('','',7,1,'subm.gif','view sub','missions', + my $crs='/'.$ENV{'request.course.id'}; + if ($ENV{'request.course.sec'}) { + $crs.='_'.$ENV{'request.course.sec'}; + } + $crs=~s/\_/\//g; + + if (&Apache::lonnet::allowed('vgr',$crs)) { + $hwkadd.=&switch('','',7,1,'subm.gif','view sub-','missions', "gocmd('/adm/grades','submission')", 'View user submissions for this assessment resource'); } - if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { + if (&Apache::lonnet::allowed('mgr',$crs)) { $hwkadd.=&switch('','',7,2,'pgrd.gif','problem','grades', "gocmd('/adm/grades','gradingmenu')", 'Modify user grades for this assessment resource'); } - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + if (&Apache::lonnet::allowed('opa',$crs)) { $hwkadd.=&switch('','',7,3,'pparm.gif','problem','parms', "gocmd('/adm/parmset','set')", 'Modify deadlines, etc, for this assessment resource'); @@ -352,14 +351,20 @@ sub innerregister { c&3&1 s&2&1&back.gif&backward&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&1 s&2&3&forw.gif&forward&&gopost('/adm/flip','forward:'+currentURL)&Go to the next resource in the course sequence&3 -s&6&3&catalog.gif&catalog&info&catalog_info()&Show catalog information -s&8&1&eval.gif&evaluate&this&gopost('/adm/evaluate',currentURL)&Provide my evaluation of this resource -s&8&2&fdbk.gif&feedback&discuss&gopost('/adm/feedback',currentURL)&Provide feedback messages or contribute to the course discussion about this resource +c&6&3 +c&8&1 +c&8&2 s&8&3&prt.gif&prepare&printout&gopost('/adm/printout',currentURL)&Prepare a printable document s&9&1&sbkm.gif&set&bookmark&set_bookmark()&Set a bookmark for this resource&2 -s&9&2&vbkm.gif&view&bookmark&edit_bookmarks()&Use or edit my bookmark collection&2 s&9&3&anot.gif&anno-&tations&annotate()&Make notes and annotations about this resource&2 ENDMENUITEMS + unless ($ENV{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) { + $menuitems.=(<<ENDREALRES); +s&6&3&catalog.gif&catalog&info&catalog_info()&Show catalog information +s&8&1&eval.gif&evaluate&this&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource +s&8&2&fdbk.gif&feedback&discuss&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource +ENDREALRES + } my $buttons=''; foreach (split(/\n/,$menuitems)) { my ($command,@rest)=split(/\&/,$_); @@ -393,6 +398,8 @@ $form ENDREGTEXT # Registered, graphical output } else { + my $requri=(split(/\?/,$ENV{'request.noversionuri'}))[0]; + $requri=&Apache::lonnet::unescape($requri); $result = (<<ENDREGTHIS); <script language="JavaScript"> @@ -401,13 +408,12 @@ var swmenu=null; function LONCAPAreg() { swmenu=$reopen; - swmenu.windowloaded(self.name); swmenu.clearTimeout(swmenu.menucltim); $timesync $newmail $buttons - swmenu.currentURL=window.location.pathname; - swmenu.reloadURL=window.location.pathname+window.location.search; + swmenu.currentURL="$requri"; + swmenu.reloadURL=swmenu.currentURL+window.location.search; swmenu.currentSymb="$ENV{'request.symb'}"; swmenu.reloadSymb="$ENV{'request.symb'}"; swmenu.currentStale=0; @@ -429,7 +435,6 @@ var swmenu=null; 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+ 'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3);clearbut(6,1)', 2000); - swmenu.windowunloaded(self.name); } // END LON-CAPA Internal @@ -453,7 +458,6 @@ var swmenu=null; function LONCAPAreg() { swmenu=$reopen - swmenu.windowloaded(self.name); $timesync swmenu.currentStale=1; swmenu.clearbut(2,1); @@ -470,8 +474,6 @@ var swmenu=null; } function LONCAPAstale() { - swmenu=$reopen - swmenu.windowunloaded(self.name); } // END LON-CAPA Internal @@ -484,12 +486,12 @@ ENDDONOTREGTHIS } sub loadevents() { - if ($ENV{'REQUEST_URI'} eq '/res/adm/pages/menu.html') { return ''; } + if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; } return 'LONCAPAreg();'; } sub unloadevents() { - if ($ENV{'REQUEST_URI'} eq '/res/adm/pages/menu.html') { return ''; } + if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; } return 'LONCAPAstale();'; } @@ -629,6 +631,9 @@ sub switch { my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$nobreak)=@_; $act=~s/\$uname/$uname/g; $act=~s/\$udom/$udom/g; + $top=&mt($top); + $bot=&mt($bot); + $desc=&mt($desc); unless (($ENV{'browser.interface'} eq 'textual') || ($ENV{'environment.remote'} eq 'off')) { # Remote @@ -638,22 +643,38 @@ sub switch { # Accessibility if ($nobreak==2) { return ''; } my $text=$top.' '.$bot; - $text=~s/\- //; - $inlineremote[10*$row+$col]="\n".($nobreak?' ':'<br />'). - '<a href="javascript:'.$act.';">'.$text.'</a> '. - ($nobreak?'':$desc); + $text=~s/\s*\-\s*//gs; + if ($nobreak) { + $inlineremote[10*$row+$col]= + '<a href="javascript:'.$act.';">'.$text.'</a>'; + } else { + $inlineremote[10*$row+$col]="\n<br />". + $desc.' <a href="javascript:'.$act.';">'.$text.'</a>'; + } } else { # Inline Remote if ($nobreak==2) { return ''; } my $text=$top.' '.$bot; - $text=~s/\- //; - $inlineremote[10*$row+$col]="\n". - ($nobreak==3?'<td width="50%" colspan="2" align="right"':'<tr><td'). - ' bgcolor="'.$tabbg.'"'.($nobreak==1?' width="50%" colspan="2"':''). - '"><a href="javascript:'.$act.';"><font color="'.$font.'"'. - ($nobreak?' size="+1"':''). - '>'.$text.'</font></a></td>'. - ($nobreak?'':'<td colspan="3" width="80%"><font color="'.$font.'" size="-1">'.$desc.'</font>').($nobreak!=1?'</tr>':''); + $text=~s/\s*\-\s*//gs; + my $pic= + '<img border="0" alt="'.$text.'" src="/res/adm/pages/'.$img.'" />'; + if ($nobreak==3) { + $inlineremote[10*$row+$col]="\n". + '<td width="40%" align="right"><font color="'.$font.'" size="+1">'.$text. + '</font></td><td width="10%" align="right" bgcolor="'.$tabbg.'">'. + '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>'; + } elsif ($nobreak) { + $inlineremote[10*$row+$col]="\n<tr>". + '<td width="10%" align="left" bgcolor="'.$tabbg.'">'. + '<a href="javascript:'.$act.';">'.$pic. + '</a></td><td width="40%" align="left"><font color="'.$font.'" size="+1">'.$text.'</font></td>'; + } else { + $inlineremote[10*$row+$col]="\n<tr>". + '<td width="10%" align="left" bgcolor="'.$tabbg.'">'. + '<a href="javascript:'.$act.';">'.$pic. + '</a></td><td colspan="3"><font color="'.$font.'">'.$desc. + '</font></td></tr>'; + } } return ''; } @@ -735,7 +756,7 @@ sub rawconfig { $output.=&secondlevel( $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); } - } elsif (($pro=~/p(\w+)/) && ($prt)) { + } elsif (($pro=~/^p(\w+)/) && ($prt)) { if (&Apache::lonnet::allowed($1,$prt)) { $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); } @@ -743,6 +764,14 @@ sub rawconfig { if ($ENV{'request.course.fn'}) { $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); } + } elsif ($pro =~ /^course_(.*)$/) { + # Check for permissions inside of a course + if (($ENV{'request.course.id'}) && + (&Apache::lonnet::allowed($1,$ENV{'request.course.id'}. + ($ENV{'request.course.sec'}?'/'.$ENV{'request.course.sec'}:'')) + )) { + $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + } } elsif ($pro eq 'author') { if ($author) { if ((($prt eq 'rca') && ($ENV{'request.role'}=~/^ca/)) || @@ -801,7 +830,7 @@ sub footer { sub utilityfunctions { unless (($ENV{'browser.interface'} eq 'textual') || ($ENV{'environment.remote'} eq 'off')) { return ''; } - my $currenturl=$ENV{'REQUEST_URI'}; + my $currenturl=$ENV{'request.noversionuri'}; my $currentsymb=$ENV{'request.symb'}; return (<<ENDUTILITY) @@ -865,7 +894,7 @@ ENDSERVERFORM sub handler { my $r = shift; - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; @@ -879,7 +908,7 @@ sub handler { $function='admin'; } if (($ENV{'request.role'}=~/^(au|ca)/) || - ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { + ($ENV{'request.noversionuri'}=~/^(\/priv|\~)/)) { $function='author'; } my $domain=&Apache::loncommon::determinedomain();