--- loncom/interface/lonmenu.pm 2006/07/31 22:53:07 1.201 +++ loncom/interface/lonmenu.pm 2009/08/13 13:28:51 1.244.2.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.201 2006/07/31 22:53:07 albertel Exp $ +# $Id: lonmenu.pm,v 1.244.2.2 2009/08/13 13:28:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,6 +36,105 @@ # browser.interface is 'textual' # +=head1 NAME + +Apache::lonmenu + +=head1 SYNOPSIS + +Coordinates the response to clicking an image. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=item show_course() + +Little texts + +=item initlittle() + +=item menubuttons() + +This gets called at the top of the body section + +=item show_return_link() + +=item registerurl() + +This gets called in the header section + +=item innerregister() + +This gets called in order to register a URL, both with the Remote +and 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() + +Switch a button or create a link +Switch acts on the javascript that is executed when a button is clicked. +The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)". + +=item secondlevel() + +=item openmenu() + +=item inlinemenu() + +=item rawconfig() + +=item close() + +=item footer() + +=item utilityfunctions() + +=item serverform() + +=item constspaceform() + +=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() + +=item jump_to_role() + +=back + +=cut + package Apache::lonmenu; use strict; @@ -44,32 +143,45 @@ use Apache::lonhtmlcommon(); use Apache::loncommon(); use Apache::lonenc(); use Apache::lonlocal; -use lib '/home/httpd/lib/perl/'; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); -use vars qw(@desklines $readdesk); +use vars qw(@desklines %category_names %category_members %category_positions $readdesk); my @inlineremote; -# ================================================================ Little texts + + +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; + } + } + } + return $course; +} sub initlittle { return &Apache::lonlocal::texthash('ret' => 'Return to Last Location', 'nav' => 'Navigate Contents', 'main' => 'Main Menu', - 'roles' => ($env{'user.adv'}? - 'Roles':'Courses'), - 'docs' => 'Course Documents', - 'exit' => 'Exit', + 'roles' => (&Apache::loncommon::show_course()? + 'Courses':'Roles'), + 'other' => 'Other Roles', + 'docs' => 'Edit Course', + 'exit' => 'Logout', + 'login' => 'Log In', 'launch' => 'Launch Remote Control', 'groups' => 'Groups', 'gdoc' => 'Group Documents', ); } -# ============================= This gets called at the top of the body section - sub menubuttons { my $forcereg=shift; my $registration=shift; @@ -86,7 +198,10 @@ sub menubuttons { my $reloadlink=''; my $docs=''; my $groups=''; + my $roles=''.$lt{'roles'}.''; + my $role_selector; my $showgroups=0; + my ($cnum,$cdom); my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'})); my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'})); @@ -102,15 +217,21 @@ sub menubuttons { } } if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my %coursegroups; my $viewgrps_permission = &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); if (!$viewgrps_permission) { - %coursegroups = &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'}); + %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum); } if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) { $showgroups = 1; } + $role_selector = &roles_selector($cdom,$cnum); + if ($role_selector) { + $roles = ''.$role_selector.'  '.$lt{'other'}.''; + } } if ($env{'browser.interface'} eq 'textual') { @@ -119,9 +240,7 @@ sub menubuttons { $navmaps=(<$lt{'nav'} ENDNAV - if (($env{'request.noversionuri'}=~/^\/adm\//) && - ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && - ($env{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) { + if (&show_return_link()) { my $escreload=&escape('return:'); $reloadlink=(<$lt{'ret'} @@ -147,8 +266,7 @@ $utility
$lt{'main'} -$reloadlink $navmaps $docs $groups -$lt{'roles'} +$reloadlink $navmaps $docs $groups $roles $lt{'exit'}

@@ -176,14 +294,15 @@ ENDMAINMENU $logo - - $lt{'exit'} + + $lt{'login'} ENDINLINEMENU } + $roles = ''.$lt{'roles'}.''; # Do we have a NAV link? if ($env{'request.course.id'}) { my $link='/adm/navmaps?postdata='.$escurl.'&postsymb='. @@ -194,7 +313,7 @@ ENDINLINEMENU $navmaps=(<$lt{'nav'} ENDNAV -my $is_group = (&Apache::loncommon::course_type() eq 'Group'); + my $is_group = (&Apache::loncommon::course_type() eq 'Group'); if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'}; $docs=(<$lt{'groups'} ENDGROUPS } - if ( - ($env{'request.noversionuri'}=~m[^/(res|public)/] && - $env{'request.symb'} eq '') - || - (($env{'request.noversionuri'}=~/^\/adm\//) && - ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && - ($env{'request.noversionuri'}!~ - m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)]) - ) - ) { + if (&show_return_link()) { my $escreload=&escape('return:'); $reloadlink=(<$lt{'ret'} ENDRELOAD } + if ($role_selector) { + $roles = ''.$role_selector.''.$lt{'other'}.''; + } } if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) { my $escreload=&escape('return:'); @@ -234,10 +347,6 @@ ENDCRELOAD } my $form=&serverform(); my $utility=&utilityfunctions(); - my $remote; - if ($env{'user.adv'}) { - $remote = ''.$lt{'launch'}.'' - } my $helplink=&Apache::loncommon::top_nav_help('Help'); return (<$lt{'roles'} +$roles $helplink $lt{'exit'} @@ -272,7 +380,19 @@ ENDINLINEMENU } } -# ====================================== This gets called in the header section +sub show_return_link { + return (($env{'request.noversionuri'}=~m{^/(res|public)/} && + $env{'request.symb'} eq '') + || + ($env{'request.noversionuri'}=~ m{^/cgi-bin/printout.pl}) + || + (($env{'request.noversionuri'}=~/^\/adm\//) && + ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && + ($env{'request.noversionuri'}!~ + m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)]) + )); +} + sub registerurl { my ($forcereg) = @_; @@ -297,9 +417,6 @@ sub registerurl { return $result.$force_title; } -# =========== This gets called in order to register a URL, both with the Remote -# =========== and in the body of the document - sub innerregister { my ($forcereg, $titletable) = @_; my $result = ''; @@ -332,16 +449,18 @@ sub innerregister { } else { $newmail= 'swmenu.setstatus("you have","messages");'; } - } elsif (($textual) + } + if (($textual) && ($env{'request.symb'}) && ($env{'request.course.id'})) { $newmail.= ''; my ($mapurl,$rid,$resurl)= &Apache::lonnet::decode_symb(&Apache::lonnet::symbread()); - $newmail.=$env{'course.'.$env{'request.course.id'}.'.description'}; + my $coursetitle=$env{'course.'.$env{'request.course.id'}.'.description'}; + $newmail.=$coursetitle; my $maptitle=&Apache::lonnet::gettitle($mapurl); my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread()); - if ($maptitle && $maptitle ne 'default.sequence') { + if ($maptitle && ($maptitle ne 'default.sequence') && ($maptitle ne $coursetitle)) { $newmail.=', '.$maptitle; } if ($restitle) { @@ -374,7 +493,7 @@ sub innerregister { if ($env{'request.symb'} ne '' && $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) { if (&Apache::lonnet::allowed('mgr',$crs)) { - $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_3]', + $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_4]', "gocmd('/adm/grades','gradingmenu')", 'Modify user grades for this assessment resource'); } elsif (&Apache::lonnet::allowed('vgr',$crs)) { @@ -395,20 +514,31 @@ sub innerregister { ### resource ### my $editbutton = ''; + my $noeditbutton = 1; + my ($cnum,$cdom); + if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } if ($env{'user.author'}) { - if ($env{'request.role'}=~/^(ca|au)/) { + if ($env{'request.role'}=~/^(aa|ca|au)/) { # Set defaults for authors my ($top,$bottom) = ('con-','struct'); my $action = "go('/priv/".$env{'user.name'}."');"; my $cadom = $env{'request.role.domain'}; my $caname = $env{'user.name'}; - my $desc = "Enter my resource construction space"; + my $desc = "Enter my construction space"; # Set defaults for co-authors if ($env{'request.role'} =~ /^ca/) { - ($cadom,$caname)=($env{'request.role'}=~/(\w+)\/(\w+)$/); + ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); ($top,$bottom) = ('co con-','struct'); $action = "go('/priv/".$caname."');"; $desc = "Enter construction space as co-author"; + } elsif ($env{'request.role'} =~ /^aa/) { + ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); + ($top,$bottom) = ('co con-','struct'); + $action = "go('/priv/".$caname."');"; + $desc = "Enter construction space as assistant co-author"; } # Check that we are on the correct machine my $home = &Apache::lonnet::homeserver($caname,$cadom); @@ -417,6 +547,7 @@ sub innerregister { foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } if (!$allowed) { $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc); + $noeditbutton = 0; } } ## @@ -425,9 +556,10 @@ sub innerregister { my $cfile=''; my $cfuname=''; my $cfudom=''; + my $uploaded; if ($env{'request.filename'}) { my $file=&Apache::lonnet::declutter($env{'request.filename'}); - $file=~s/^(\w+)\/(\w+)/\/priv\/$2/; + $file=~s/^($match_domain)\/($match_username)/\/priv\/$2/; # Check that the user has permission to edit this resource ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1); if (defined($cfudom)) { @@ -443,12 +575,29 @@ sub innerregister { # Finally, turn the button on or off if ($cfile && !$const_space) { $editbutton=&switch - ('','',6,1,'cstr.gif','edit[_1]','resource[_2]', + ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]', "go('".$cfile."');","Edit this resource"); + $noeditbutton = 0; } elsif ($editbutton eq '') { $editbutton=&clear(6,1); } } + if (($noeditbutton) && ($env{'request.filename'})) { + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + my $file=&Apache::lonnet::declutter($env{'request.filename'}); + if (defined($cnum) && defined($cdom)) { + if (&is_course_upload($file,$cnum,$cdom)) { + my $cfile = &edit_course_upload($file,$cnum,$cdom); + if ($cfile) { + $editbutton=&switch + ('','',6,1,'pcstr.gif','edit[_1]', + 'resource[_2]',"go('".$cfile."');", + 'Edit this resource'); + } + } + } + } + } ### ### # Prepare the rest of the buttons @@ -462,42 +611,73 @@ sub innerregister { } else { $currdir =~ s#[^/]+$##; my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn); + my $esc_currdir = &Apache::loncommon::escape_single($currdir); $menuitems=(< 0){ + $menuitems.="anot2.gif"; +}else{ + $menuitems.="anot.gif"; +} +$menuitems.="&anno-[_1]&tations[_1]&annotate()&"; +$menuitems.="Make notes and annotations about this resource&&1\n"; + unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) { + if (!$env{'request.enc'}) { + $menuitems.=(< +$inlineremote[21] $inlineremote[23] +ENDARROWSINLINE + if (&hidden_button_check() ne 'yes') { + $inlinebuttons .= (< +ENDINLINEICONS + } + } else { + if ($inlineremote[21] ne '' || $inlineremote[23] ne '') { + $inlinebuttons=(<$inlineremote[21] $inlineremote[23] -$inlineremote[61]$inlineremote[62]$inlineremote[63] -$inlineremote[71]$inlineremote[72]$inlineremote[73] -$inlineremote[81]$inlineremote[82]$inlineremote[83] -$inlineremote[91]$inlineremote[92]$inlineremote[93] -ENDINLINE - } +ENDFIRSTLINE + } + if (&hidden_button_check() ne 'yes') { + foreach my $row (6..9) { + if ($inlineremote[${row}.'1'] ne '' + || $inlineremote[$row.'2'] ne '' + || $inlineremote[$row.'3'] ne '') { + $inlinebuttons .= <<"ENDLINE"; +$inlineremote["${row}1"]$inlineremote["${row}2"]$inlineremote["${row}3"] +ENDLINE + } + } + } + } + } } $result =(< // BEGIN LON-CAPA Internal $timesync -$newmail $tablestart $inlinebuttons $tableend +$newmail @@ -629,6 +832,42 @@ ENDDONOTREGTHIS return $result; } +sub is_course_upload { + my ($file,$cnum,$cdom) = @_; + my $uploadpath = &LONCAPA::propath($cdom,$cnum); + $uploadpath =~ s{^\/}{}; + if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) || + ($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) { + return 1; + } + return; +} + +sub edit_course_upload { + my ($file,$cnum,$cdom) = @_; + my $cfile; + if ($file =~/\.(htm|html|css|js|txt)$/) { + my $ext = $1; + my $url = &Apache::lonnet::hreflocation('',$file); + my $home = &Apache::lonnet::homeserver($cnum,$cdom); + my @ids=&Apache::lonnet::current_machine_ids(); + my $dest; + if ($home && grep(/^\Q$home\E$/,@ids)) { + $dest = $url.'?forceedit=1'; + } else { + unless (&Apache::lonnet::get_locks()) { + $dest = '/adm/switchserver?otherserver='. + $home.'&role='.$env{'request.role'}. + '&url='.$url.'&forceedit=1'; + } + } + if ($dest) { + $cfile = &HTML::Entities::encode($dest,'"<>&'); + } + } + return $cfile; +} + sub loadevents() { if ($env{'request.state'} eq 'construct' || $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } @@ -641,7 +880,6 @@ sub unloadevents() { return 'LONCAPAstale();'; } -# ============================================================= Start up remote sub startupremote { my ($lowerurl)=@_; @@ -737,8 +975,9 @@ sub load_remote_msg { ($env{'environment.remote'} eq 'off')) { return ''; } my $esclowerurl=&escape($lowerurl); - my $link=&mt('Continue on in Inline Menu mode', - "/adm/remote?action=collapse&url=$esclowerurl"); + my $link=&mt('[_1]Continue[_2] on in Inline Menu mode', + '', + ''); return(<
@@ -748,17 +987,22 @@ sub load_remote_msg {

$link

ENDREMOTEFORM } -# ================================================================= Reopen menu + +sub get_menu_name { + my $hostid = $Apache::lonnet::perlvar{'lonHostID'}; + $hostid =~ s/\W//g; + return 'LCmenu'.$hostid; +} + sub reopenmenu { if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { return ''; } - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; + my $menuname = &get_menu_name(); my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); return('window.open('.$nothing.',"'.$menuname.'","",false);'); } -# =============================================================== Open the menu sub open { my $returnval=''; @@ -766,16 +1010,17 @@ sub open { ($env{'environment.remote'} eq 'off')) { return ''; } - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; - unless (shift eq 'unix') { + my $menuname = &get_menu_name(); + +# unless (shift eq 'unix') { # resizing does not work on linux because of virtual desktop sizes - $returnval.=(<'.$text.''; } else { - $inlineremote[10*$row+$col]="\n
". + $inlineremote[$idx]="\n
". $desc.' '.$text.''; } } else { # Inline Remote + if ($env{'environment.icons'} ne 'classic') { + $img=~s/\.gif$/\.png/; + } if ($nobreak==2) { return ''; } my $text=$top.' '.$bot; $text=~s/\s*\-\s*//gs; - my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'}; - if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; } my $pic= - ''.$text.''; + ''.$text.''; if ($env{'browser.interface'} eq 'faketextual') { # Accessibility if ($nobreak==3) { - $inlineremote[10*$row+$col]="\n". + $inlineremote[$idx]="\n". ''.$text. ''. ''.$pic.''; } elsif ($nobreak) { - $inlineremote[10*$row+$col]="\n". + $inlineremote[$idx]="\n". ''. ''.$pic.' - '.$text.''; + '.$text.''; } else { - $inlineremote[10*$row+$col]="\n". + $inlineremote[$idx]="\n". ''. ''.$pic. ''. - $desc.''; + ''.$desc.''; } } else { # Inline Menu - $inlineremote[10*$row+$col]= - ''.$pic. - ''.$desc.''; + if ($env{'environment.icons'} eq 'iconsonly') { + $inlineremote[$idx]=''.$pic.''; + } else { + $inlineremote[$idx]= + ''.$pic. + ''.$desc.''; + } } } return ''; @@ -873,19 +1127,19 @@ sub switch { sub secondlevel { my $output=''; my - ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc)=@_; + ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat)=@_; if ($prt eq 'any') { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } elsif ($prt=~/^r(\w+)/) { if ($rol eq $1) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } return $output; } sub openmenu { - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; + my $menuname = &get_menu_name(); if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { return ''; } my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); @@ -893,10 +1147,37 @@ sub openmenu { } sub inlinemenu { - @inlineremote=(); - undef @inlineremote; + undef(@inlineremote); + undef(%category_members); &rawconfig(1); - return join('',map { (defined($_)?$_:'') } @inlineremote); + my $output=''; + for (my $col=1; $col<=2; $col++) { + $output.='"; + } + $output.="
'; + for (my $row=1; $row<=8; $row++) { + foreach my $cat (keys(%category_members)) { + if ($category_positions{$cat} ne "$col,$row") { next; } + #$output.=''; + $output.='
'; + $output.=''.&mt($category_names{$cat}).''; + $output.='
'.&mt($category_names{$cat}).'
'; + my %active=(); + foreach my $menu_item (split(/\:/,$category_members{$cat})) { + if ($inlineremote[$menu_item]) { + $active{$menu_item}=1; + } + } + foreach my $item (sort(keys(%active))) { + $output.=$inlineremote[$item]; + &Apache::lonnet::logthis("item=$item output=$inlineremote[$item]"); + } + $output.='
'; + $output.=''; + } + } + $output.="
"; + return $output; } sub rawconfig { @@ -913,6 +1194,7 @@ sub rawconfig { my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; my $adv=$env{'user.adv'}; + my $show_course=&Apache::loncommon::show_course(); my $author=$env{'user.author'}; my $crs=''; if ($env{'request.course.id'}) { @@ -927,11 +1209,12 @@ sub rawconfig { my $rol=$env{'request.role'}; my $requested_domain = $env{'request.role.domain'}; foreach my $line (@desklines) { - my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc)=split(/\:/,$line); + my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line); $prt=~s/\$uname/$uname/g; $prt=~s/\$udom/$udom/g; $prt=~s/\$crs/$crs/g; $prt=~s/\$requested_domain/$requested_domain/g; + if ($category_names{$cat}!~/\w/) { $cat='oth'; } my $type = &Apache::loncommon::course_type(); if ($type eq 'Group') { $desc = &convert_menu_function($desc,$type); @@ -940,29 +1223,39 @@ sub rawconfig { $output.=&clear($row,$col); } elsif ($pro eq 'any') { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } elsif ($pro eq 'smp') { unless ($adv) { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'adv') { if ($adv) { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'shc') { + if ($show_course) { + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'nsc') { + if (!$show_course) { + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } elsif (($pro=~/^p(\w+)/) && ($prt)) { if (&Apache::lonnet::allowed($1,$prt)) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'course') { if ($env{'request.course.fn'}) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro =~ /^courseenv_(.*)$/) { my $key = $1; if ($env{'course.'.$env{'request.course.id'}.'.'.$key}) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro =~ /^course_(.*)$/) { # Check for permissions inside of a course @@ -970,18 +1263,19 @@ sub rawconfig { (&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); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'author') { if ($author) { if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) || + (($prt eq 'raa') && ($env{'request.role'}=~/^aa/)) || (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) { # Check that we are on the correct machine my $cadom=$requested_domain; my $caname=$env{'user.name'}; - if ($prt eq 'rca') { + if (($prt eq 'rca') || ($prt eq 'raa')) { ($cadom,$caname)= - ($env{'request.role'}=~/(\w+)\/(\w+)$/); + ($env{'request.role'}=~/($match_domain)\/($match_username)$/); } $act =~ s/\$caname/$caname/g; my $home = &Apache::lonnet::homeserver($caname,$cadom); @@ -989,11 +1283,39 @@ sub rawconfig { my @ids=&Apache::lonnet::current_machine_ids(); foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } if ($allowed) { - $output.=switch($caname,$cadom, - $row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($caname,$cadom, + $row,$col,$img,$top,$bot,$act,$desc,$cat); + } + } + } + } elsif ($pro eq 'tools') { + my @tools = ('aboutme','blog','portfolio'); + if (grep(/^\Q$prt\E$/,@tools)) { + if (!&Apache::lonnet::usertools_access($env{'user.name'}, + $env{'user.domain'}, + $prt,undef,'tools')) { + $output.=&clear($row,$col); + next; + } + } elsif ($prt eq 'reqcrs') { + my $showreqcrs = 0; + foreach my $type ('official','unofficial') { + if (&Apache::lonnet::usertools_access($env{'user.name'}, + $env{'user.domain'}, + $type,undef,'requestcourses')) { + $showreqcrs = 1; + last; } } + if (!$showreqcrs) { + $output.=&clear($row,$col); + next; + } } + $prt='any'; + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } } unless (($env{'browser.interface'} eq 'textual') || @@ -1012,7 +1334,7 @@ sub rawconfig { sub close { if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { return ''; } - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; + my $menuname = &get_menu_name(); return(< window.status='Accessing Remote Control'; @@ -1069,13 +1391,16 @@ sub utilityfunctions { 'add_entries' => { 'onload' => 'javascript:document.goannotate.submit();'}}); + my $end_page_annotate = + &Apache::loncommon::end_page({'js_ready' => 1}); + my $start_page_bookmark = &Apache::loncommon::start_page('Bookmarks',undef, {'only_body' => 1, 'js_ready' => 1, 'bgcolor' => '#BBBBBB',}); - my $end_page = + my $end_page_bookmark = &Apache::loncommon::end_page({'js_ready' => 1}); return (<" - +"" + +"" +"<\\/form>" - +'$end_page'); + +'$end_page_annotate'); annotator.document.close(); } @@ -1207,17 +1532,17 @@ function set_bookmark() { bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0'); bmquery.document.write( '$start_page_bookmark' - +"
\\n
Link Name:
" - +"
Address:

<\\/center><\\/td>" - +"<\\/tr><\\/table><\\/form><\\/center>" - +'$end_page' ); + +'
' + +'
Link Name:
' + +'
Address:

' + +'$end_page_bookmark' ); bmquery.document.close(); } @@ -1277,6 +1602,260 @@ sub convert_menu_function { return $rolename; } +sub hidden_button_check { + my $hidden; + if ($env{'request.course.id'} eq '') { + return; + } + if ($env{'request.role.adv'}) { + return; + } + my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide'); + return $buttonshide; +} + +sub roles_selector { + my ($cdom,$cnum) = @_; + my $now = time; + my (%courseroles,%seccount); + my $is_cc; + my $role_selector; + if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) { + my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum}); + + if ((($start) && ($start<0)) || + (($end) && ($end<$now)) || + (($start) && ($now<$start))) { + $is_cc = 0; + } else { + $is_cc = 1; + } + } + if ($is_cc) { + &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount); + } else { + my %gotnosection; + foreach my $item (keys(%env)) { + if ($item =~ m-^user\.role\.([^.]+)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) { + my $role = $1; + my $sec = $2; + next if ($role eq 'gr'); + my ($start,$end) = split(/\./,$env{$item}); + next if (($start && $start > $now) || ($end && $end < $now)); + if ($sec eq '') { + if (!$gotnosection{$role}) { + $seccount{$role} ++; + $gotnosection{$role} = 1; + } + } + if (ref($courseroles{$role}) eq 'ARRAY') { + if ($sec ne '') { + if (!grep(/^Q$sec\E$/,@{$courseroles{$role}})) { + push(@{$courseroles{$role}},$sec); + $seccount{$role} ++; + } + } + } else { + @{$courseroles{$role}} = (); + if ($sec ne '') { + $seccount{$role} ++; + push(@{$courseroles{$role}},$sec); + } + } + } + } + } + my @roles_order = ('cc','in','ta','ep','ad','st'); + if (keys(%courseroles) > 1) { + $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles); + $role_selector .= '
+ '."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
'; + } + return $role_selector; +} + +sub get_all_courseroles { + my ($cdom,$cnum,$courseroles,$seccount) = @_; + unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH')) { + return; + } + my ($result,$cached) = + &Apache::lonnet::is_cached_new('getcourseroles',$cdom.'_'.$cnum); + if (defined($cached)) { + if (ref($result) eq 'HASH') { + if ((ref($result->{'roles'}) eq 'HASH') && + (ref($result->{'seccount'}) eq 'HASH')) { + %{$courseroles} = %{$result->{'roles'}}; + %{$seccount} = %{$result->{'seccount'}}; + return; + } + } + } + my %gotnosection; + my %adv_roles = + &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1); + foreach my $role (keys(%adv_roles)) { + my ($urole,$usec) = split(/:/,$role); + if (!$gotnosection{$urole}) { + $seccount->{$urole} ++; + $gotnosection{$urole} = 1; + } + if (ref($courseroles->{$urole}) eq 'ARRAY') { + if ($usec ne '') { + if (!grep(/^\Q$usec\E$/,@{$courseroles->{$urole}})) { + push(@{$courseroles->{$urole}},$usec); + $seccount->{$urole} ++; + } + } + } else { + @{$courseroles->{$urole}} = (); + if ($usec ne '') { + $seccount->{$urole} ++; + push(@{$courseroles->{$urole}},$usec); + } + } + } + my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum,['st']); + @{$courseroles->{'st'}} = (); + if (keys(%sections_count) > 0) { + push(@{$courseroles->{'st'}},keys(%sections_count)); + $seccount->{'st'} = scalar(keys(%sections_count)); + } + my $rolehash = { + 'roles' => $courseroles, + 'seccount' => $seccount, + }; + &Apache::lonnet::do_cache_new('getcourseroles',$cdom.'_'.$cnum,$rolehash); + return; +} + +sub jump_to_role { + my ($cdom,$cnum,$seccount,$courseroles) = @_; + my %lt = &Apache::lonlocal::texthash( + this => 'This role has section(s) associated with it.', + ente => 'Enter a specific section.', + orlb => 'Enter a specific section, or leave blank for no section.', + avai => 'Available sections are:', + youe => 'You entered an invalid section choice:', + plst => 'Please try again', + ); + my $js; + if (ref($courseroles) eq 'HASH') { + $js = ' var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n". + ' var numsec = new Array();'."\n". + ' var rolesections = new Array();'."\n". + ' var rolenames = new Array();'."\n". + ' var roleseclist = new Array();'."\n"; + my @items = keys(%{$courseroles}); + for (my $i=0; $i<@items; $i++) { + $js .= ' rolenames['.$i.'] = "'.$items[$i].'";'."\n"; + my ($secs,$secstr); + if (ref($courseroles->{$items[$i]}) eq 'ARRAY') { + my @sections = sort { $a <=> $b } @{$courseroles->{$items[$i]}}; + $secs = join('","',@sections); + $secstr = join(', ',@sections); + } + $js .= ' rolesections['.$i.'] = new Array("'.$secs.'");'."\n". + ' roleseclist['.$i.'] = "'.$secstr.'";'."\n". + ' numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n"; + } + } + return <<"END"; + +END +} + # ================================================================ Main Program @@ -1289,7 +1868,11 @@ BEGIN { $configline=(split(/\#/,$configline))[0]; $configline=~s/^\s+//; chomp($configline); - if ($configline) { + if ($configline=~/^cat\:/) { + my @entries=split(/\:/,$configline); + $category_positions{$entries[2]}=$entries[1]; + $category_names{$entries[2]}=$entries[3]; + } elsif ($configline) { push(@desklines,$configline); } }