--- loncom/interface/lonmenu.pm 2012/12/13 17:38:40 1.369.2.27 +++ loncom/interface/lonmenu.pm 2013/01/03 20:19:10 1.369.2.33 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.27 2012/12/13 17:38:40 raeburn Exp $ +# $Id: lonmenu.pm,v 1.369.2.33 2013/01/03 20:19:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -268,7 +268,6 @@ sub primary_menu { if (ref($primary_submenu{$title}) eq 'ARRAY') { foreach my $item (@{$primary_submenu{$title}}) { next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'})); - next if (($item->[2] eq 'reqcrs') && (!&check_for_rcrs())); next if ((($item->[2] eq 'portfolio') || ($item->[2] eq 'blog')) && (!&Apache::lonnet::usertools_access('','',$item->[2], @@ -346,16 +345,27 @@ sub secondary_menu { my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec); my $author = &getauthor(); + my ($canmodifycoauthor); + if ($env{'request.role'} eq "au./$env{'user.domain'}/") { + my $extent = "$env{'user.domain'}/$env{'user.name'}"; + if ((&Apache::lonnet::allowed('cca',$extent)) || + (&Apache::lonnet::allowed('caa',$extent))) { + $canmodifycoauthor = 1; + } + } + 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 ($roleswitcher_js,$roleswitcher_form); + foreach my $menuitem (@secondary_menu) { # evaluate conditions next if ref($menuitem) ne 'ARRAY'; next if $$menuitem[4] ne 'always' - && $$menuitem[4] ne 'author' + && ($$menuitem[4] ne 'author' && $$menuitem[4] ne 'cca') && !$env{'request.course.id'}; next if $$menuitem[4] =~ /^mdc/ && !$canedit; @@ -383,6 +393,8 @@ sub secondary_menu { && ($canviewgrps || !%groups); next if $$menuitem[4] eq 'author' && !$author; + next if $$menuitem[4] eq 'cca' + && !$canmodifycoauthor; my $title = $menuitem->[3]; if (defined($secondary_submenu{$title})) { @@ -413,12 +425,12 @@ sub secondary_menu { } } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { # special treatment for role selector - my $roles_selector = &roles_selector( + ($roleswitcher_js,$roleswitcher_form,my $switcher) = + &roles_selector( $env{'course.' . $env{'request.course.id'} . '.domain'}, - $env{'course.' . $env{'request.course.id'} . '.num'} ); - - $menu .= $roles_selector ? "
  • $roles_selector
  • " - : ''; + $env{'course.' . $env{'request.course.id'} . '.num'} + ); + $menu .= $switcher; } else { $menu .= &prep_menuitem(\@$menuitem); } @@ -446,6 +458,9 @@ sub secondary_menu { if ($menu) { $menu = ""; } + if ($roleswitcher_form) { + $menu .= "\n$roleswitcher_js\n$roleswitcher_form"; + } return $menu; } @@ -577,8 +592,7 @@ sub innerregister { } my $trail; if ($env{'form.folderpath'}) { - my $editbutton = - &prepare_functions($resurl,$forcereg,$group,undef,undef,1); + &prepare_functions($resurl,$forcereg,$group,undef,undef,1); ($trail) = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); } else { @@ -609,75 +623,86 @@ sub innerregister { # ============================ This is for URLs that actually can be registered if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) || ($forcereg)) { - my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, - $forceview,$editbutton); - if (($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) || - ($env{'request.role'} !~/^(aa|ca|au)/)) { - $editbutton = &prepare_functions($resurl,$forcereg,$group); - } - if ($editbutton eq '') { - &clear(6,1); - } + + my %swtext; + if ($noremote) { + %swtext = &get_inline_text(); + } else { + %swtext = &get_rc_text(); + } + my $hwkadd=''; + + my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, + $forceview,$editbutton); + if (($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) || + ($env{'request.role'} !~/^(aa|ca|au)/)) { + $editbutton = &prepare_functions($resurl,$forcereg,$group); + } + if ($editbutton eq '') { + $editbutton = &clear(6,1); + } # # This applies in course context # - if ($env{'request.course.id'}) { - $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); - my @privs; - if ($env{'request.symb'} ne '') { - if ($env{'request.filename'}=~/$LONCAPA::assess_re/) { - push(@privs,('mgr','vgr')); - } - push(@privs,'opa'); - } - foreach my $priv (@privs) { - $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'}); - if (!$perms{$priv} && $env{'request.course.sec'} ne '') { - $perms{$priv} = - &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}"); + if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + my @privs; + if ($env{'request.symb'} ne '') { + if ($env{'request.filename'}=~/$LONCAPA::assess_re/) { + push(@privs,('mgr','vgr')); + } + push(@privs,'opa'); + } + foreach my $priv (@privs) { + $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'}); + if (!$perms{$priv} && $env{'request.course.sec'} ne '') { + $perms{$priv} = + &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}"); + } } - } # # Determine whether or not to show Grades and Submissions buttons # - if ($env{'request.symb'} ne '' && - $env{'request.filename'}=~/$LONCAPA::assess_re/) { - if ($perms{'mgr'}) { - &switch('','',7,2,'pgrd.png','Content Grades','grades[_4]', - "gocmd('/adm/grades','gradingmenu')", - 'Content Grades'); - } elsif ($perms{'vgr'}) { - &switch('','',7,2,'subm.png','Content Submissions','missions[_1]', - "gocmd('/adm/grades','submission')", - 'Content Submissions'); - } - } - if (($env{'request.symb'} ne '') && ($perms{'opa'})) { - &switch('','',7,3,'pparm.png','Content Settings','parms[_2]', - "gocmd('/adm/parmset','set')", - 'Content Settings'); - } + if ($env{'request.symb'} ne '' && + $env{'request.filename'}=~/$LONCAPA::assess_re/) { + if ($perms{'mgr'}) { + $hwkadd.= &switch('','',7,2,'pgrd.png','Content Grades', + 'grades[_4]', + "gocmd('/adm/grades','gradingmenu')", + 'Content Grades'); + } elsif ($perms{'vgr'}) { + $hwkadd .= &switch('','',7,2,'subm.png','Content Submissions', + 'missions[_1]', + "gocmd('/adm/grades','submission')", + 'Content Submissions'); + } + } + if (($env{'request.symb'} ne '') && ($perms{'opa'})) { + $hwkadd .= &switch('','',7,3,'pparm.png','Content Settings', + 'parms[_2]',"gocmd('/adm/parmset','set')", + 'Content Settings'); + } # End grades/submissions check # # This applies to items inside a folder/page modifiable in the course. # - if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) { - my $text = 'Edit Folder'; - if (($mapurl =~ /\.page$/) || - ($env{'request.symb'}=~ - m{uploaded/$cdom/$cnum/default_\d+\.page$})) { - $text = 'Edit Page'; - } - &switch('','',7,4,'docs-22x22.png',$text,'parms[_2]', - "gocmd('/adm/coursedocs','direct')", - 'Folder/Page Content'); - } + if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) { + my $text = 'Edit Folder'; + if (($mapurl =~ /\.page$/) || + ($env{'request.symb'}=~ + m{uploaded/$cdom/$cnum/default_\d+\.page$})) { + $text = 'Edit Page'; + } + $hwkadd .= &switch('','',7,4,'docs-22x22.png',$text,'parms[_2]', + "gocmd('/adm/coursedocs','direct')", + 'Folder/Page Content'); + } # End modifiable folder/page container check - } + } # End course context # Prepare the rest of the buttons @@ -712,12 +737,12 @@ ENDMENUITEMS undef($menuitems); } } - if (ref($bread_crumbs) eq 'ARRAY') { - &Apache::lonhtmlcommon::clear_breadcrumbs(); - foreach my $crumb (@{$bread_crumbs}){ - &Apache::lonhtmlcommon::add_breadcrumb($crumb); - } + if (ref($bread_crumbs) eq 'ARRAY') { + &Apache::lonhtmlcommon::clear_breadcrumbs(); + foreach my $crumb (@{$bread_crumbs}){ + &Apache::lonhtmlcommon::add_breadcrumb($crumb); } + } } elsif ( defined($env{'request.course.id'}) && $env{'request.symb'} ne '' ) { # @@ -1221,7 +1246,6 @@ sub prepare_functions { # Determine whether or not to display 'Edit' icon/button # if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) { - if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) { my $file=&Apache::lonnet::declutter($env{'request.filename'}); ($cfile,$home,$switchserver,$forceedit,$forceview) = &Apache::lonnet::can_edit_resource($file,$cnum,$cdom, @@ -1277,7 +1301,15 @@ sub prepare_functions { $forceedit,$forceview,$forcereg, $env{'form.title'},$env{'form.suppurl'}); } - } elsif ($resurl !~ m{^adm/($match_domain)/($match_username)/aboutme$}) { + } elsif (($resurl =~ m{^/?adm/viewclasslist$}) && + (&Apache::lonnet::allowed('opa',$env{'request.course.id'}))) { + ($cfile,$home,$switchserver,$forceedit,$forceview) = + &Apache::lonnet::can_edit_resource($resurl,$cnum,$cdom,$resurl, + $env{'form.symb'}); + $editbutton = &get_editbutton($cfile,$home,$switchserver, + $forceedit,$forceview,$forcereg); + } elsif (($resurl !~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) && + ($resurl ne '/cgi-bin/printout.pl')) { if ($env{'request.filename'}) { my $file=&Apache::lonnet::declutter($env{'request.filename'}); ($cfile,$home,$switchserver,$forceedit,$forceview) = @@ -1294,7 +1326,7 @@ sub prepare_functions { if ($env{'request.course.id'}) { # This applies to about me page for users in a course - if ($resurl =~ m{^adm/($match_domain)/($match_username)/aboutme$}) { + if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) { my ($sdom,$sname) = ($1,$2); unless (&Apache::lonnet::is_course($sdom,$sname)) { &switch('','',6,4,'mail-message-new-22x22.png','Message to user', @@ -1331,14 +1363,6 @@ sub prepare_functions { 'Add records'); } } - } elsif ($resurl =~ m{^/?adm/viewclasslist}) { -# This applies to viewclasslist page for users in a course - if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) { - &switch('','',6,4,'pparm.png','Settings', - '', - "go('/adm/courseprefs?actions=classlists&phase=display')", - 'Student-viewable classlist options'); - } } if (($env{'form.folderpath'} =~ /^supplemental/) && (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && @@ -1392,7 +1416,7 @@ sub advtools_crumbs { 'advtools', @funcs[61,71,72,73,74,92]); } elsif ($env{'request.noversionuri'} eq '/adm/viewclasslist') { &Apache::lonhtmlcommon::add_breadcrumb_tool( - 'advtools', @funcs[64]); + 'advtools', $funcs[61]); } } @@ -2069,7 +2093,7 @@ sub roles_selector { my $now = time; my (%courseroles,%seccount,%courseprivs); my $is_cc; - my $role_selector; + my ($js,$form,$switcher,$switchtext); my $ccrole; if ($crstype eq 'Community') { $ccrole = 'co'; @@ -2159,40 +2183,69 @@ sub roles_selector { } my $switchtext; if ($crstype eq 'Community') { - $switchtext = &mt('Switch community role to...') + $switchtext = &mt('Switch community role') } else { - $switchtext = &mt('Switch course role to...') + $switchtext = &mt('Switch course role') } my @roles_order = ($ccrole,'in','ta','ep','ad','st'); - if (keys(%courseroles) > 1) { - $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv); - $role_selector .= '
    - '."\n". + ' '."\n". + ' '."\n". + ' '."\n"; + if ($destsymb ne '') { + $form .= ' '."\n"; + } + $form .= '
    '."\n"; foreach my $role (@roles_order) { + my $include; if (defined($courseroles{$role})) { - $role_selector .= "\n".''; + if ($env{'request.role'} =~ m{^\Q$role\E}) { + if ($seccount{$role} > 1) { + $include = 1; + } + } else { + $include = 1; + } + } + if ($include) { + push(@submenu,['javascript:adhocRole('."'$role'".')', + &Apache::lonnet::plaintext($role,$crstype)]); } } foreach my $role (sort(keys(%courseroles))) { if ($role =~ /^cr/) { - $role_selector .= "\n".''; + my $include; + if ($env{'request.role'} =~ m{^\Q$role\E}) { + if ($seccount{$role} > 1) { + $include = 1; + } + } else { + $include = 1; + } + if ($include) { + push(@submenu,['javascript:adhocRole('."'$role'".')', + &Apache::lonnet::plaintext($role)]); + } } } - $role_selector .= ''."\n"; - if ($destsymb ne '') { - $role_selector .= ''."\n"; + if (@submenu > 0) { + $switcher = &create_submenu('','',$switchtext,\@submenu); } - $role_selector .= - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''; } - return $role_selector; + return ($js,$form,$switcher); } sub get_all_courseroles { @@ -2331,9 +2384,8 @@ sub jump_to_role { return <<"END";