--- loncom/interface/lonmenu.pm 2012/11/08 18:37:44 1.390 +++ loncom/interface/lonmenu.pm 2013/01/07 22:36:11 1.409 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.390 2012/11/08 18:37:44 raeburn Exp $ +# $Id: lonmenu.pm,v 1.409 2013/01/07 22:36:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -248,7 +248,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], @@ -326,16 +325,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; @@ -360,15 +370,17 @@ sub secondary_menu { && !%groups; next if $$menuitem[4] eq 'author' && !$author; + next if $$menuitem[4] eq 'cca' + && !$canmodifycoauthor; if ($$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); } @@ -396,6 +408,9 @@ sub secondary_menu { if ($menu) { $menu = ""; } + if ($roleswitcher_form) { + $menu .= "\n$roleswitcher_js\n$roleswitcher_form"; + } return $menu; } @@ -441,43 +456,70 @@ sub innerregister { undef(@inlineremote); - my $resurl; - - if ($env{'request.course.id'} && $env{'request.symb'} eq '') { - $resurl = $env{'request.noversionuri'}; - } - - if ( $env{'request.symb'} && $env{'request.course.id'} ) { + my ($mapurl,$resurl); - (my $mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread()); - my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'}; + if ($env{'request.course.id'}) { + if ($env{'request.symb'}) { + ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread()); + my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'}; - my $maptitle = &Apache::lonnet::gettitle($mapurl); - my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread()); + my $maptitle = &Apache::lonnet::gettitle($mapurl); + my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread()); #SD #course_type only Course and Community? # - my @crumbs; - unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps') - && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) { - @crumbs = ({text => Apache::loncommon::course_type() - . ' Contents', - href => "Javascript:gopost('/adm/navmaps','')"}); - } - if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { - push(@crumbs, {text => '...', - no_mt => 1}); - } - - push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle - && $maptitle ne 'default.sequence' - && $maptitle ne $coursetitle); - - push @crumbs, {text => $restitle, no_mt => 1} if $restitle; - - &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb(@crumbs); + my @crumbs; + unless (($forcereg) && + ($env{'request.noversionuri'} eq '/adm/navmaps') && + ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) { + @crumbs = ({text => Apache::loncommon::course_type() + . ' Contents', + href => "Javascript:gopost('/adm/navmaps','')"}); + } + if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { + push(@crumbs, {text => '...', + no_mt => 1}); + } + + push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle + && $maptitle ne 'default.sequence' + && $maptitle ne $coursetitle); + + push @crumbs, {text => $restitle, no_mt => 1} if $restitle; + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb(@crumbs); + } else { + $resurl = $env{'request.noversionuri'}; + my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'}); + my $crstype = &Apache::loncommon::course_type(); + my $title = &mt('View Resource'); + if ($resurl =~ m{^\Q/uploaded$courseurl/supplemental/\E(default|\d+)/}) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folderpath','title']); + &Apache::lonhtmlcommon::clear_breadcrumbs(); + if ($env{'form.title'}) { + $title = $env{'form.title'}; + } + my $trail; + if ($env{'form.folderpath'}) { + &prepare_functions($resurl,$forcereg,$group,undef,undef,1); + ($trail) = + &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } else { + &Apache::lonhtmlcommon::add_breadcrumb( + {text => "Supplemental $crstype Content", + href => "javascript:gopost('/adm/supplemental','')"}); + $title = &mt('View Resource'); + ($trail) = + &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } + return $trail; + } + unless ($env{'request.state'} eq 'construct') { + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); + } + } } elsif (! $const_space){ #a situation when we're looking at a resource outside of context of a #course or construction space (e.g. with cumulative rights) @@ -492,19 +534,12 @@ sub innerregister { || $forcereg ); my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, $forceview,$editbutton); - if ($env{'request.noversionuri'} =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) { - ($cfile,$home,$switchserver,$forceedit,$forceview) = - &Apache::lonnet::can_edit_resource($env{'request.noversionuri'},$cnum,$cdom, - &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group); - if (($cfile) && ($home ne '') && ($home ne 'no_host')) { - $editbutton = &get_editbutton($cfile,$home,$switchserver, - $forceedit,$forceview,$forcereg); - } - } elsif ($env{'request.role'} !~/^(aa|ca|au)/) { + 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); + $editbutton = &clear(6,1); } # @@ -548,13 +583,19 @@ sub innerregister { "gocmd('/adm/parmset','set')", 'Content Settings'); } -# End grades/submissions check +# End grades/submissions check # -# This applies to items inside a folder/page modifiable in the course. +# This applies to items inside a folder/page modifiable in the course. # if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) { - &switch('','',7,4,'docs-22x22.png','Folder/Page Content','parms[_2]', + 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'); } @@ -727,9 +768,24 @@ ENDMENUITEMS sub get_editbutton { my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg) = @_; - my $jscall = - &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver, - $forceedit,$forcereg,$env{'request.symb'}); + my $jscall; + if (($forceview) && ($env{'form.todocs'})) { + my ($folderpath,$command); + if ($env{'request.symb'}) { + $folderpath = &Apache::loncommon::symb_to_docspath($env{'request.symb'}); + } elsif ($env{'form.folderpath'} =~ /^supplemental/) { + $folderpath = $env{'form.folderpath'}; + $command = '&forcesupplement=1'; + } + $folderpath = &escape(&HTML::Entities::encode(&escape($folderpath),'<>&"')); + $jscall = "go('/adm/coursedocs?folderpath=$folderpath$command')"; + } else { + $jscall = &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver, + $forceedit,$forcereg,$env{'request.symb'}, + &escape($env{'form.folderpath'}), + &escape($env{'form.title'}),$env{'form.idx'}, + &escape($env{'form.suppurl'},$env{'form.todocs'})); + } if ($jscall) { my $icon = 'pcstr.png'; my $label = 'Edit'; @@ -745,7 +801,7 @@ sub get_editbutton { } sub prepare_functions { - my ($resurl,$forcereg,$group,$bread_crumbs,$advtools) = @_; + my ($resurl,$forcereg,$group,$bread_crumbs,$advtools,$docscrumbs) = @_; unless ($env{'request.registered'}) { undef(@inlineremote); } @@ -763,19 +819,15 @@ sub prepare_functions { # Determine whether or not to display 'Edit' icon/button # if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) { -# -# This applies to a user's own about me page -# - my ($sdom,$sname) = ($1,$2); my $file=&Apache::lonnet::declutter($env{'request.filename'}); - if (($sdom eq $env{'user.domain'}) && ($sname eq $env{'user.name'})) { - ($cfile,$home,$switchserver,$forceedit,$forceview) = - &Apache::lonnet::can_edit_resource($file,$cnum,$cdom, - &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group); - $editbutton = &get_editbutton($cfile,$env{'user.home'},$switchserver, + ($cfile,$home,$switchserver,$forceedit,$forceview) = + &Apache::lonnet::can_edit_resource($file,$cnum,$cdom, + &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group); + if (($cfile) && ($home ne '') && ($home ne 'no_host')) { + $editbutton = &get_editbutton($cfile,$home,$switchserver, $forceedit,$forceview,$forcereg); } - } elsif ((!$editbutton) && (!$env{'request.course.id'}) && + } elsif ((!$env{'request.course.id'}) && ($env{'user.author'}) && ($env{'request.filename'}) && ($env{'request.role'} !~/^(aa|ca|au)/)) { # @@ -786,7 +838,6 @@ sub prepare_functions { ($cfile,$home,$switchserver,$forceedit,$forceview) = &Apache::lonnet::can_edit_resource($file,$cnum,$cdom, &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group); - # Turn the button on or off if (($cfile) && ($home ne '') && ($home ne 'no_host')) { $editbutton = &get_editbutton($cfile,$home,$switchserver, $forceedit,$forceview,$forcereg); @@ -813,7 +864,25 @@ sub prepare_functions { $editbutton = &get_editbutton($cfile,$home,$switchserver, $forceedit,$forceview,$forcereg); } - } elsif ($resurl !~ m{^adm/($match_domain)/($match_username)/aboutme$}) { + } elsif (($resurl eq '/adm/extresedit') && + (($env{'form.symb'}) || ($env{'form.folderpath'}))) { + ($cfile,$home,$switchserver,$forceedit,$forceview) = + &Apache::lonnet::can_edit_resource($resurl,$cnum,$cdom,$resurl, + $env{'form.symb'}); + if ($cfile ne '') { + $editbutton = &get_editbutton($cfile,$home,$switchserver, + $forceedit,$forceview,$forcereg, + $env{'form.title'},$env{'form.suppurl'}); + } + } 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) = @@ -828,9 +897,9 @@ sub prepare_functions { } # End determination of 'Edit' icon/button display -# This applies to about me page for users in a course if ($env{'request.course.id'}) { - if ($resurl =~ m{^adm/($match_domain)/($match_username)/aboutme$}) { +# This applies to about me page for users in a course + 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', @@ -838,7 +907,9 @@ sub prepare_functions { "go('/adm/email?compose=individual&recname=$sname&recdom=$sdom')", 'Send message to specific user'); } - if (&Apache::lonnet::in_course($sdom,$sname,$cdom,$cnum)) { + my $hideprivileged = 1; + if (&Apache::lonnet::in_course($sdom,$sname,$cdom,$cnum,undef, + $hideprivileged)) { foreach my $priv ('vsa','vgr','srm') { $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'}); if (!$perms{$priv} && $env{'request.course.sec'} ne '') { @@ -866,11 +937,29 @@ sub prepare_functions { } } } + if (($env{'form.folderpath'} =~ /^supplemental/) && + (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && + (($resurl =~ m{^/adm/wrapper/ext/}) || + ($resurl =~ m{^/uploaded/$cdom/$cnum/supplemental/}) || + ($resurl eq '/adm/supplemental') || + ($resurl =~ m{^/public/$cdom/$cnum/syllabus$}) || + ($resurl =~ m{^/adm/$match_domain/$match_username/aboutme$}))) { + my @folders=split('&',$env{'form.folderpath'}); + if ((@folders > 2) || ($resurl ne '/adm/supplemental')) { + my $esc_path=&escape(&HTML::Entities::encode(&escape($env{'form.folderpath'}),'<>&"')); + &switch('','',7,4,'docs-22x22.png','Edit Folder','parms[_2]', + "location.href='/adm/coursedocs?command=direct&forcesupplement=1&supppath=$esc_path'", + 'Folder/Page Content'); + } + } } # End checking for items for about me page for users in a course - - if ($env{'request.registered'}) { + if ($docscrumbs) { + &Apache::lonhtmlcommon::clear_breadcrumb_tools(); + &advtools_crumbs(@inlineremote); + return $editbutton; + } elsif ($env{'request.registered'}) { return $editbutton; } else { if (ref($bread_crumbs) eq 'ARRAY') { @@ -898,6 +987,9 @@ sub advtools_crumbs { } elsif ($env{'request.noversionuri'} !~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) { &Apache::lonhtmlcommon::add_breadcrumb_tool( 'advtools', @funcs[61,71,72,73,74,92]); + } elsif ($env{'request.noversionuri'} eq '/adm/viewclasslist') { + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'advtools', $funcs[61]); } } @@ -1492,7 +1584,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'; @@ -1580,42 +1672,66 @@ sub roles_selector { } } } - my $switchtext; - if ($crstype eq 'Community') { - $switchtext = &mt('Switch community role to...') - } else { - $switchtext = &mt('Switch course role to...') - } + $switchtext = &mt('Switch 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 { @@ -1754,9 +1870,8 @@ sub jump_to_role { return <<"END";