--- loncom/interface/lonmenu.pm 2008/02/03 05:07:58 1.234 +++ loncom/interface/lonmenu.pm 2008/12/13 15:55:40 1.239.4.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.234 2008/02/03 05:07:58 raeburn Exp $ +# $Id: lonmenu.pm,v 1.239.4.2 2008/12/13 15:55:40 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -74,6 +74,7 @@ sub initlittle { 'main' => 'Main Menu', 'roles' => (&show_course()? 'Courses':'Roles'), + 'other' => 'Other Roles', 'docs' => 'Edit Course', 'exit' => 'Exit', 'login' => 'Log In', @@ -101,7 +102,10 @@ sub menubuttons { my $reloadlink=''; my $docs=''; my $groups=''; + my $roles='<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>'; + 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'})); @@ -117,15 +121,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 = '<span class="LC_nobreak">'.$role_selector.' <a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></span>'; + } } if ($env{'browser.interface'} eq 'textual') { @@ -160,8 +170,7 @@ $utility </script> <div id="LC_top_nav"> <a href="/adm/menu" target="_top">$lt{'main'}</a> -$reloadlink $navmaps $docs $groups -<a href="/adm/roles" target="_top">$lt{'roles'}</a> +$reloadlink $navmaps $docs $groups $roles <a href="/adm/logout" target="_top">$lt{'exit'}</a> </div> <br /> @@ -197,6 +206,7 @@ ENDMAINMENU </font> ENDINLINEMENU } + $roles = '<td><a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a></td>'; # Do we have a NAV link? if ($env{'request.course.id'}) { my $link='/adm/navmaps?postdata='.$escurl.'&postsymb='. @@ -225,6 +235,9 @@ ENDGROUPS <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td> ENDRELOAD } + if ($role_selector) { + $roles = '<td>'.$role_selector.'</td><td><a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></td>'; + } } if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) { my $escreload=&escape('return:'); @@ -238,10 +251,6 @@ ENDCRELOAD } my $form=&serverform(); my $utility=&utilityfunctions(); - my $remote; - if ($env{'user.adv'}) { - $remote = '<td><a href="/adm/remote?action=launch&url='.$escurl.'" target="_top">'.$lt{'launch'}.'</a></td>' - } my $helplink=&Apache::loncommon::top_nav_help('Help'); return (<<ENDINLINEMENU); @@ -259,8 +268,7 @@ $reloadlink $navmaps $docs $groups -$remote -<td><a href="/adm/roles" target="_top">$lt{'roles'}</a></td> +$roles <td class="LC_top_nav_help">$helplink</td> <td class="LC_top_nav_exit"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td> </tr> @@ -421,7 +429,7 @@ sub innerregister { 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'}=~/($match_domain)\/($match_username)$/); @@ -885,8 +893,9 @@ sub switch { $top=&mt($top); $bot=&mt($bot); $desc=&mt($desc); - $img=&mt($img); - + if (($env{'environment.remote'} ne 'off') || ($env{'environment.icons'} eq 'classic')) { + $img=&mt($img); + } my $idx=10*$row+$col; $category_members{$cat}.=':'.$idx; @@ -1112,6 +1121,18 @@ sub rawconfig { } } } + } 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)) { + $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') || @@ -1410,6 +1431,221 @@ sub hidden_button_check { return $buttonshide; } +sub roles_selector { + my ($cdom,$cnum) = @_; + my $now = time; + my (%courseroles,%seccount,%gotnosection); + 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) { + 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); + @{$courseroles{'st'}} = (); + if (keys(%sections_count) > 0) { + push(@{$courseroles{'st'}},keys(%sections_count)); + } + } else { + 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 .= '<form name="rolechooser" method="post" action="/adm/roles"> + <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">'; + $role_selector .= '<option value="">'.&mt('Switch course role to...').'</option>'; + foreach my $role (@roles_order) { + if (defined($courseroles{$role})) { + $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; + } + } + foreach my $role (sort(keys(%courseroles))) { + if ($role =~ /^cr/) { + $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; + } + } + $role_selector .= '</select>'."\n". + '<input type="hidden" name="destinationurl" value="'. + $ENV{'REQUEST_URI'}.'" />'."\n". + '<input type="hidden" name="gotorole" value="1" />'."\n". + '<input type="hidden" name="selectrole" value="" />'."\n". + '<input type="hidden" name="switch" value="1" />'."\n". + '</form>'; + } + return $role_selector; +} + +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"; + } + } + my $output = <<"END"; +<script type="text/javascript"> +function adhocRole(roleitem) { + $js + var newrole = document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value; + if (newrole == '') { + return; + } + var fullrole = newrole+'./$cdom/$cnum'; + var selidx = ''; + for (var i=0; i<rolenames.length; i++) { + if (rolenames[i] == newrole) { + selidx = i; + } + } + var secok = 1; + var secchoice = ''; + if (selidx >= 0) { + if (numsec[selidx] > 1) { + secok = 0; + var numrolesec = rolesections[selidx].length; + var msgidx = numsec[selidx] - numrolesec; + secchoice = prompt("$lt{'this'}\\n"+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],""); + if (secchoice == '') { + if (msgidx > 0) { + secok = 1; + } + } else { + for (var j=0; j<rolesections[selidx].length; j++) { + if (rolesections[selidx][j] == secchoice) { + secok = 1; + } + } + } + } else { + if (rolesections[selidx].length == 1) { + secchoice = rolesections[selidx][0]; + } + } + } + if (secok == 1) { + if (secchoice != '') { + fullrole += '/'+secchoice; + } + } else { + document.rolechooser.elements[roleitem].selectedIndex = 0; + if (secchoice != null) { + alert("$lt{'youe'} \\""+secchoice+"\\".\\n $lt{'plst'}"); + } + return; + } + if (fullrole == "$env{'request.role'}") { + return; + } + itemid = retrieveIndex('gotorole'); + if (itemid != -1) { + document.rolechooser.elements[itemid].name = fullrole; + } + document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value = fullrole; + document.rolechooser.selectrole.value = '1'; + document.rolechooser.submit(); + return; +} + +function retrieveIndex(item) { + for (var i=0;i<document.rolechooser.elements.length;i++) { + if (document.rolechooser.elements[i].name == item) { + return i; + } + } + return -1; +} + + +</script> +END + return $output; +} + + # ================================================================ Main Program BEGIN {