--- loncom/interface/lonmenu.pm 2012/08/03 17:35:32 1.369.2.17 +++ loncom/interface/lonmenu.pm 2015/03/03 16:53:59 1.431.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.17 2012/08/03 17:35:32 raeburn Exp $ +# $Id: lonmenu.pm,v 1.431.2.1 2015/03/03 16:53:59 musolffc Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,10 +106,11 @@ secondary_menu(). =item primary_menu() -This routine evaluates @primary_menu and returns XHTML for the menu -that contains following links: About, Message, Roles, Help, Logout +This routine evaluates @primary_menu and returns a two item array, +with the array elements containing XHTML for the left and right sides of +the menu that contains the following links: About, Message, Roles, Help, Logout @primary_menu is filled within the BEGIN block of this module with -entries from mydesk.tab +entries from mydesk.tab =item secondary_menu() @@ -117,9 +118,9 @@ Same as primary_menu() but operates on @ =item create_submenu() -Creates XHTML for unordered list of sub-menu items which belong to a +Creates XHTML for unordered list of sub-menu items which belong to a particular top-level menu item. Uses hover pseudo class in css to display -dropdown list when mouse hovers over top-level item. Support for IE6 +dropdown list when mouse hovers over top-level item. Support for IE6 (no hover psuedo class) via LC_hoverable class for
  • tag for top- level item, which employs jQuery to handle behavior on mouseover. @@ -127,30 +128,37 @@ Inputs: 4 - (a) link and (b) target for (c) title for text wrapped by anchor tag in top level item. (d) reference to array of arrays of sub-menu items. + The underlying datastructure used in (d) contains data from mydesk.tab. + It consists of an array which has an array for each item appearing in + the menu (e.g. [["link", "title", "condition"]] for a single-item menu). + create_submenu() supports also the creation of XHTML for nested dropdown + menus represented by unordered lists. This is done by replacing the + scalar used for the link with an arrayreference containing the menuitems + for the nested menu. This can be done recursively so that the next menu + may also contain nested submenus. + + Example: + [ # begin of datastructure + ["/home/", "Home", "condition1"], # 1st item of the 1st layer menu + [ # 2nd item of the 1st layer menu + [ # anon. array for nested menu + ["/path1", "Path1", undef], # 1st item of the 2nd layer menu + ["/path2", "Path2", undef], # 2nd item of the 2nd layer menu + [ # 3rd item of the 2nd layer menu + [[...], [...], ..., [...]], # containing another menu layer + "Sub-Sub-Menu", # title for this container + undef + ] + ], # end of array/nested menu + "Sub-Menu", # title for the container item + undef + ] # end of 2nd item of the 1st layer menu +] + =item innerregister() This gets called in order to register a URL 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() @@ -202,7 +210,7 @@ use HTML::Entities(); use Apache::lonwishlist(); use vars qw(@desklines %category_names %category_members %category_positions - $readdesk @primary_menu %primary_submenu @secondary_menu %secondary_submenu); + $readdesk @primary_menu %primary_submenu @secondary_menu); my @inlineremote; @@ -223,15 +231,16 @@ sub prep_menuitem { . qq| href="$$menuitem[0]" target="_top">$link
  • |; } -# primary_menu() evaluates @primary_menu and returns XHTML for the menu -# that contains following links: -# About, Message, Personal, Roles, Help, Logout +# primary_menu() evaluates @primary_menu and returns a two item array, +# with the array elements containing XHTML for the left and right sides of +# the menu that contains the following links: +# Personal, About, Message, Roles, Help, Logout # @primary_menu is filled within the BEGIN block of this module with # entries from mydesk.tab sub primary_menu { - my $menu; + my (%menu); # each element of @primary contains following array: - # (link url, icon path, alt text, link text, condition) + # (link url, icon path, alt text, link text, condition, position) my $public; if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) { @@ -256,6 +265,10 @@ sub primary_menu { && !&Apache::loncommon::show_course(); ## my $title = $menuitem->[3]; + my $position = $menuitem->[5]; + if ($position eq '') { + $position = 'right'; + } if (defined($primary_submenu{$title})) { my ($link,$target); if ($menuitem->[0] ne '') { @@ -267,18 +280,17 @@ sub primary_menu { my @primsub; 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')) && + next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'})); + next if ((($item->[2] eq 'portfolio') || + ($item->[2] eq 'blog')) && (!&Apache::lonnet::usertools_access('','',$item->[2], undef,'tools'))); push(@primsub,$item); } if (@primsub > 0) { - $menu .= &create_submenu($link,$target,$title,\@primsub); + $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1); } elsif ($link) { - $menu .= '
  • '.&mt($title).'
  • '; + $menu{$position} .= '
  • '.&mt($title).'
  • '; } } } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink @@ -289,19 +301,23 @@ sub primary_menu { 'helpdeskmail', $defdom,$origmail); if ($to ne '') { - $menu .= &prep_menuitem($menuitem); + $menu{$position} .= &prep_menuitem($menuitem); } } else { - $menu .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; + $menu{$position} .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; } } else { - $menu .= prep_menuitem($menuitem); + $menu{$position} .= prep_menuitem($menuitem); } } - $menu =~ s/\[domain\]/$env{'user.domain'}/g; - $menu =~ s/\[user\]/$env{'user.name'}/g; - - return "
      $menu
    "; + my @output = ('',''); + if ($menu{'left'} ne '') { + $output[0] = "
      $menu{'left'}
    "; + } + if ($menu{'right'} ne '') { + $output[1] = "
      $menu{'right'}
    "; + } + return @output; } #returns hashref {user=>'',dom=>''} containing: @@ -330,6 +346,7 @@ sub getauthor{ } sub secondary_menu { + my ($httphost) = @_; my $menu; my $crstype = &Apache::loncommon::course_type(); @@ -338,31 +355,69 @@ sub secondary_menu { : ''); my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'}); my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'}; - my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec); - my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); - my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec); + if ($canviewroster eq 'disabled') { + undef($canviewroster); + } + my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec); + my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); + my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec); my $canmodpara = &Apache::lonnet::allowed('opa', $crs_sec); my $canvgr = &Apache::lonnet::allowed('vgr', $crs_sec); - my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec); + my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec); my $author = &getauthor(); + my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv); + if ($env{'request.course.id'}) { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($canedit) { + $showsyllabus = 1; + $showfeeds = 1; + } else { + unless (&Apache::lonnet::is_on_map("public/$cdom/$cnum/syllabus")) { + if (($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'}) || + ($env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'}) || + ($env{'course.'.$env{'request.course.id'}.'.updatedsyllabus'}) || + ($env{'request.course.syllabustime'})) { + $showsyllabus = 1; + } + } + if ($env{'request.course.feeds'}) { + $showfeeds = 1; + } + } + unless ($canmgr) { + my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom); + if (keys(%slots) > 0) { + $showresv = 1; + } + } + } + + 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; - next if $$menuitem[4] eq 'mdcCourse' - && ($crstype eq 'Community'); - next if $$menuitem[4] eq 'mdcCommunity' - && ($crstype eq 'Course'); next if $$menuitem[4] eq 'nvgr' && $canvgr; next if $$menuitem[4] eq 'vgr' @@ -373,53 +428,45 @@ sub secondary_menu { && ($canmodifyuser || !$canviewroster); next if $$menuitem[4] eq 'mgr' && !$canmgr; - next if $$menuitem[4] eq 'nmgr' - && $canmgr; + next if $$menuitem[4] eq 'showresv' + && !$showresv; next if $$menuitem[4] eq 'whn' && !$canviewwnew; next if $$menuitem[4] eq 'opa' && !$canmodpara; - next if $$menuitem[4] eq 'nvcg' - && ($canviewgrps || !%groups); + next if $$menuitem[4] =~ /showgroups$/ + && !$canviewgrps + && !%groups; + next if $$menuitem[4] eq 'showsyllabus' + && !$showsyllabus; + next if $$menuitem[4] eq 'showfeeds' + && !$showfeeds; next if $$menuitem[4] eq 'author' && !$author; + next if $$menuitem[4] eq 'cca' + && !$canmodifycoauthor; - my $title = $menuitem->[3]; - if (defined($secondary_submenu{$title})) { - my ($link,$target); - if ($menuitem->[0] ne '') { - $link = $menuitem->[0]; - $target = '_top'; - } else { - $link = '#'; - } - my @scndsub; - if (ref($secondary_submenu{$title}) eq 'ARRAY') { - foreach my $item (@{$secondary_submenu{$title}}) { - if (ref($item) eq 'ARRAY') { - next if ($item->[2] eq 'vgr' && !$canvgr); - next if ($item->[2] eq 'opa' && !$canmodpara); - next if ($item->[2] eq 'cst' && !$canmodifyuser); - next if ($item->[2] eq 'mgr' && !$canmgr); - next if ($item->[2] eq 'vcg' && !$canviewgrps); - push(@scndsub,$item); - } - } - if (@scndsub > 0) { - $menu .= &create_submenu($link,$target,$title,\@scndsub); - } elsif ($link) { - $menu .= '
  • '.&mt($title).'
  • '; - } - } - } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { + 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'}, + $httphost + ); + $menu .= $switcher; } else { + if ($$menuitem[3] eq 'Syllabus' && $env{'request.course.id'}) { + my $url = $$menuitem[0]; + $url =~ s{\[cdom\]/\[cnum\]}{$cdom/$cnum}; + if (&Apache::lonnet::is_on_map($url)) { + unless ($$menuitem[0] =~ /\?register=1/) { + $$menuitem[0] .= '?register=1'; + } + } else { + $$menuitem[0] =~ s{\?register=1}{}; + } + } $menu .= &prep_menuitem(\@$menuitem); } } @@ -443,71 +490,115 @@ sub secondary_menu { } $menu =~ s/\[uname\]/$$author{user}/g; $menu =~ s/\[udom\]/$$author{dom}/g; - - return ""; + if ($showsyllabus || $showfeeds) { + $menu =~ s/\[cnum\]/$cnum/g; + $menu =~ s/\[cdom\]/$cdom/g; + } + if ($menu) { + $menu = ""; + } + if ($roleswitcher_form) { + $menu .= "\n$roleswitcher_js\n$roleswitcher_form"; + } + return $menu; } sub create_submenu { - my ($link,$target,$title,$submenu) = @_; + my ($link,$target,$title,$submenu,$translate) = @_; return unless (ref($submenu) eq 'ARRAY'); my $disptarget; if ($target ne '') { $disptarget = ' target="'.$target.'"'; } + my $name; + if ($title eq 'Personal') { + if ($env{'user.name'} && $env{'user.domain'}) { + $name = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + } else { + $name = &mt($title); + } + } else { + $name = &mt($title); + } my $menu = '
  • '. - ''. - ''.&mt($title). + ''. + ''.$name. ''. ' ▼'. '
  • '; + + return $menu; +} + +# helper routine for create_submenu +# build the dropdown (and nested submenus) recursively +# see perldoc create_submenu documentation for further information +sub build_submenu { + my ($target, $submenu, $translate, $first_level) = @_; + if (!defined(@{$submenu})) { + return ''; + } + + my $menu = ''; my $count = 0; my $numsub = scalar(@{$submenu}); foreach my $item (@{$submenu}) { $count ++; if (ref($item) eq 'ARRAY') { + my $href = $item->[0]; + my $bordertop; my $borderbot; + my $title; + + if ($translate) { + $title = &mt($item->[1]); + } else { + $title = $item->[1]; + } + + if ($count == 1 && !$first_level) { + $bordertop = 'border-top: 1px solid black;'; + } if ($count == $numsub) { - $borderbot = 'border-bottom:1px solid black;'; + $borderbot = 'border-bottom: 1px solid black;'; + } + + # href is a reference to another submenu + if (ref($href) eq 'ARRAY') { + $menu .= '
  • '; + $menu .= '

    ' + . $title . '

    '; + $menu .= ''; + $menu .= '
  • '; + } else { # href is the actual hyperlink and does not represent another submenu + # for the current menu title + if ($href =~ /(aboutme|rss\.html)$/) { + next unless (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')); + $href =~ s/\[domain\]/$env{'user.domain'}/g; + $href =~ s/\[user\]/$env{'user.name'}/g; + } + unless (($href eq '') || ($href =~ /^\#/)) { + $target = ' target="_top"'; + } + + $menu .= '
  • '; + $menu .= '' . $title . ''; + $menu .= '
  • '; } - $menu .= '
  • '. - &mt($item->[1]).'
  • '; } } - $menu .= ''; return $menu; } -sub registerurl { - my ($forcereg) = @_; - my $result = ''; - if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } - my $force_title=''; - if ($env{'request.state'} eq 'construct') { - $force_title=&Apache::lonxml::display_title(); - } - if (($env{'environment.remote'} eq 'off') || - ((($env{'request.publicaccess'}) || - (!&Apache::lonnet::is_on_map( - &unescape($env{'request.noversionuri'})))) && - (!$forcereg))) { - return - $result - .'' - .$force_title; - } -# Graphical display after login only - if ($env{'request.registered'} && !$forcereg) { return ''; } - $result.=&innerregister($forcereg); - return $result.$force_title; -} - sub innerregister { - my ($forcereg,$bread_crumbs) = @_; + my ($forcereg,$bread_crumbs,$group) = @_; my $const_space = ($env{'request.state'} eq 'construct'); my $is_const_dir = 0; @@ -515,278 +606,163 @@ sub innerregister { $env{'request.registered'} = 1; - my $noremote = ($env{'environment.remote'} eq 'off'); - undef(@inlineremote); - my $reopen=&Apache::lonmenu::reopenmenu(); - - my $newmail=''; - - if (&Apache::lonmsg::newmail() && !$noremote) { - # We have new mail and remote is up - $newmail= 'swmenu.setstatus("you have","messages");'; - } - - my $resurl; - 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); - }elsif (! $const_space){ + 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; + } elsif ($resurl =~ m{^\Q/uploaded$courseurl/portfolio/syllabus/}) { + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &prepare_functions('/public'.$courseurl."/syllabus", + $forcereg,$group,undef,undef,1); + $title = &mt('Syllabus File'); + my ($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) &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); + unless ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) { + &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); + } } - my $timesync = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' ); # ============================================================================= # ============================ This is for URLs that actually can be registered - unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) - || ($forcereg)) { - unless ($noremote) { -# Not registered, graphical - return (< -// - -ENDDONOTREGTHIS - +# +# 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'}"); + } } - return ''; - } - -# -- This applies to homework problems for users with grading privileges - my $crs='/'.$env{'request.course.id'}; - if ($env{'request.course.sec'}) { - $crs.='_'.$env{'request.course.sec'}; - } - $crs=~s/\_/\//g; - - my $hwkadd=''; +# +# Determine whether or not to show Grades and Submissions buttons +# if ($env{'request.symb'} ne '' && - $env{'request.filename'}=~/$LONCAPA::assess_re/) { - if (&Apache::lonnet::allowed('mgr',$crs)) { - $hwkadd.=&switch('','',7,2,'pgrd.png','Content Grades','grades[_4]', - "gocmd('/adm/grades','gradingmenu')", - 'Content Grades'); - } elsif (&Apache::lonnet::allowed('vgr',$crs)) { - $hwkadd.=&switch('','',7,2,'subm.png','Content Submissions','missions[_1]', - "gocmd('/adm/grades','submission')", - 'Content Submissions'); - } - } - if ($env{'request.symb'} ne '' && - &Apache::lonnet::allowed('opa',$crs)) { - $hwkadd.=&switch('','',7,3,'pparm.png','Content Settings','parms[_2]', - "gocmd('/adm/parmset','set')", - 'Content Settings'); + $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'}=~/^uploaded/ && - &Apache::lonnet::allowed('mdc',$crs)) { - $hwkadd.=&switch('','',7,4,'docs.png','Folder/Page Content','parms[_2]', - "gocmd('/adm/coursedocs','direct')", - 'Folder/Page Content'); - } -# -- End Homework - ### - ### Determine whether or not to display the 'cstr' button for this - ### 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'}=~/^(aa|ca|au)/) { -# -# We have the role of an author -# - # Set defaults for authors - my ($top,$bottom) = ('con-','struct'); - my $action = "go('/priv/".$env{'user.domain'}.'/'.$env{'user.name'}."');"; - my $cadom = $env{'request.role.domain'}; - my $caname = $env{'user.name'}; - 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)$/); - ($top,$bottom) = ('co con-','struct'); - $action = "go('/priv/".$cadom.'/'.$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/".$cadom.'/'.$caname."');"; - $desc = "Enter construction space as assistant co-author"; - } - # Check that we are on the correct machine - my $home = &Apache::lonnet::homeserver($caname,$cadom); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if (!$allowed) { - $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc); - $noeditbutton = 0; - } - } -# -# We are an author for some stuff, but currently do not have the role of author. -# Figure out if we have authoring privileges for the resource we are looking at. -# This should maybe become a privilege check in lonnet -# - ## - ## Determine if user can edit url. - ## - my $cfile=''; - my $cfuname=''; - my $cfudom=''; - my $uploaded; - my $switchserver=''; - my $home; - if ($env{'request.filename'}) { - my $file=&Apache::lonnet::declutter($env{'request.filename'}); - if (defined($cnum) && defined($cdom)) { - $uploaded = &is_course_upload($file,$cnum,$cdom); - } - if (!$uploaded) { - - $file=~s{^(priv/$match_domain/$match_username)}{/$1}; - $file=~s{^($match_domain/$match_username)}{/priv/$1}; +# End grades/submissions check - # Check that the user has permission to edit this resource - my $setpriv = 1; - ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$setpriv); - if (defined($cfudom)) { - $home=&Apache::lonnet::homeserver($cfuname,$cfudom); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if ($allowed) { - $cfile=$file; - } else { - $switchserver=$file; - } - } - } - } - # Finally, turn the button on or off - if (($cfile || $switchserver) && !$const_space) { - my $nocrsedit; - # Suppress display where CC has switched to student role. - if ($env{'request.course.id'}) { - unless(&Apache::lonnet::allowed('mdc', - $env{'request.course.id'})) { - $nocrsedit = 1; - } - } - if ($nocrsedit) { - $editbutton=&clear(6,1); - } else { - my $bot = "go('$cfile')"; - if ($switchserver) { - if ( $env{'request.symb'} && $env{'request.course.id'} ) { - $cfile = '/adm/switchserver?otherserver='.$home.'&role='. - &HTML::Entities::encode($env{'request.role'},'"<>&').'&symb='. - &HTML::Entities::encode($env{'request.symb'},'"<>&'); - $bot = "need_switchserver('$cfile');"; - } - } - $editbutton=&switch - ('','',6,1,'pcstr.png','Edit','resource[_2]', - $bot,"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.png','Edit', - 'resource[_2]',"go('".$cfile."');", - 'Edit this resource'); - } - } - } - } - } - if ($env{'request.course.id'}) { - if ($resurl eq "public/$cdom/$cnum/syllabus") { - if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) { - if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - $editbutton=&switch('','',6,1,'pcstr.png','Edit', - 'resource[_2]', - "go('/adm/courseprefs?phase=display&actions=courseinfo')", - 'Edit this resource'); - } - } +# +# 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'); } - ### - ### +# End modifiable folder/page container check + } +# End course context + # Prepare the rest of the buttons my ($menuitems,$got_prt,$got_wishlist); if ($const_space) { @@ -842,7 +818,7 @@ ENDMENUITEMS # wishlist is only available for users with access to resource-pool # and links can only be set for resources within the resource-pool $menuitems .= (< 0){ } $menuitems.="&Notes&&annotate()&"; $menuitems.="Make notes and annotations about this resource&&1\n"; +my $is_mobile; +if ($env{'browser.mobile'}) { + $is_mobile = 1; +} unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) { if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/}) && ($env{'request.noversionuri'} !~ m{^/uploaded/$match_domain/$match_courseid/docs/})) { $menuitems.=(< -// - -ENDREGTHIS + #publish button in construction space + if ($env{'request.state'} eq 'construct'){ + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'advtools', $inlineremote[63]); + } else { + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'tools', $inlineremote[63]); + } + &advtools_crumbs(@inlineremote); } + } return &Apache::lonhtmlcommon::scripttag('', 'start') . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0) . &Apache::lonhtmlcommon::scripttag('', 'end'); } -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/})) { +sub get_editbutton { + my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg) = @_; + 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'; + if ($forceview) { + $icon = 'tolastloc.png'; + $label = 'Exit Editing'; + } + &switch('','',6,1,$icon,$label,'resource[_2]', + $jscall,"Edit this resource"); 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'; +sub prepare_functions { + my ($resurl,$forcereg,$group,$bread_crumbs,$advtools,$docscrumbs) = @_; + unless ($env{'request.registered'}) { + undef(@inlineremote); + } + my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, + $forceview); + + 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 $editbutton = ''; +# +# Determine whether or not to display 'Edit' icon/button +# + 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, + &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.course.id'}) && + ($env{'user.author'}) && ($env{'request.filename'}) && + ($env{'request.role'} !~/^(aa|ca|au)/)) { +# +# Currently do not have the role of author or co-author. +# Do we have authoring privileges for the resource? +# + my $file=&Apache::lonnet::declutter($env{'request.filename'}); + ($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 ($env{'request.course.id'}) { +# +# This applies in course context +# + if (($perms{'mdc'}) && + (($resurl eq "/public/$cdom/$cnum/syllabus") || + ($resurl =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/}))) { + $cfile = $resurl; + $home = &Apache::lonnet::homeserver($cnum,$cdom); + if ($env{'form.forceedit'}) { + $forceview = 1; + } else { + $forceedit = 1; + } + $editbutton = &get_editbutton($cfile,$home,$switchserver, + $forceedit,$forceview,$forcereg); + } 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) = + &Apache::lonnet::can_edit_resource($file,$cnum,$cdom, + &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group); + if ($cfile ne '') { + $editbutton = &get_editbutton($cfile,$home,$switchserver, + $forceedit,$forceview,$forcereg); + } } - } - if ($dest) { - $cfile = &HTML::Entities::encode($dest,'"<>&'); } } - return $cfile; -} +# End determination of 'Edit' icon/button display -sub loadevents() { - if ($env{'request.state'} eq 'construct' || - $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } - return 'LONCAPAreg();'; -} - -sub unloadevents() { - if ($env{'request.state'} eq 'construct' || - $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } - return 'LONCAPAstale();'; -} - -sub startupremote { - my ($lowerurl)=@_; - unless ($env{'environment.remote'} eq 'on') { - return (''); + 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$}) { + my ($sdom,$sname) = ($1,$2); + unless (&Apache::lonnet::is_course($sdom,$sname)) { + &switch('','',6,4,'mail-message-new-22x22.png','Message to user', + '', + "go('/adm/email?compose=individual&recname=$sname&recdom=$sdom')", + 'Send message to specific user'); + } + 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 '') { + $perms{$priv} = + &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}"); + } + } + if ($perms{'vsa'}) { + &switch('','',6,5,'trck-22x22.png','Activity', + '', + "go('/adm/trackstudent?selected_student=$sname:$sdom')", + 'View recent activity by this person'); + } + if ($perms{'vgr'}) { + &switch('','',6,6,'rsrv-22x22.png','Reservations', + '', + "go('/adm/slotrequest?command=showresv&origin=aboutme&uname=$sname&udom=$sdom')", + 'Slot reservation history'); + } + if ($perms{'srm'}) { + &switch('','',6,7,'contact-new-22x22.png','Records', + '', + "go('/adm/email?recordftf=retrieve&recname=$sname&recdom=$sdom')", + 'Add records'); + } + } + } + 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'); + } + } } -# -# The Remote actually gets launched! -# - my $configmenu=&rawconfig(); - my $esclowerurl=&escape($lowerurl); - my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited'); - return(< -// - -ENDREMOTESTARTUP -} -sub setflags() { - return(< -// - -ENDSETFLAGS -} - -sub maincall() { - unless ($env{'environment.remote'} eq 'on') { return ''; } - return(< -// - -ENDMAINCALL -} - -sub load_remote_msg { - my ($lowerurl)=@_; - - unless ($env{'environment.remote'} eq 'on') { return ''; } - - my $esclowerurl=&escape($lowerurl); - my $link=&mt('[_1]Continue[_2] on in Inline Menu mode' - ,'' - ,''); - return(< -
    - -
    -

    -

    $link

    -ENDREMOTEFORM -} - -sub get_menu_name { - my $hostid = $Apache::lonnet::perlvar{'lonHostID'}; - $hostid =~ s/\W//g; - return 'LCmenu'.$hostid; -} - - -sub reopenmenu { - unless ($env{'environment.remote'} eq 'on') { return ''; } - my $menuname = &get_menu_name(); - my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); - return('window.open('.$nothing.',"'.$menuname.'","",false);'); +# End checking for items for about me page for users in a course + 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') { + if (@inlineremote > 0) { + if (ref($advtools) eq 'ARRAY') { + @{$advtools} = @inlineremote; + } + } + return; + } elsif (@inlineremote > 0) { + &Apache::lonhtmlcommon::clear_breadcrumb_tools(); + &advtools_crumbs(@inlineremote); + return &Apache::lonhtmlcommon::scripttag('', 'start') + . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0) + . &Apache::lonhtmlcommon::scripttag('', 'end'); + } + } } - -sub open { - my $returnval=''; - unless ($env{'environment.remote'} eq 'on') { - return - ''; - } - my $menuname = &get_menu_name(); - -# unless (shift eq 'unix') { -# resizing does not work on linux because of virtual desktop sizes -# $returnval.=(< -ENDOPEN - return ''; +sub advtools_crumbs { + my @funcs = @_; + if ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) { + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'advtools', @funcs[61,64,65,66,67,74]); + } 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]); + } + return; } - # ================================================================== Raw Config sub clear { my ($row,$col)=@_; - if ($env{'environment.remote'} eq 'on') { - if (($row<1) || ($row>13)) { return ''; } - return "\n".qq(window.status+='.';swmenu.clearbut($row,$col);); - } else { - $inlineremote[10*$row+$col]=''; - return ''; - } + $inlineremote[10*$row+$col]=''; + return ''; } # ============================================ Switch a button or create a link @@ -1237,14 +1177,6 @@ sub switch { my $idx=10*$row+$col; $category_members{$cat}.=':'.$idx; - if ($env{'environment.remote'} eq 'on') { - if (($row<1) || ($row>13)) { return ''; } -# Remote - $img=~s/\.png$/\.gif/; - return "\n". - qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc");); - } - # Inline Menu if ($nobreak==2) { return ''; } my $text=$top.' '.$bot; @@ -1279,7 +1211,7 @@ sub switch { unless ($env{'request.state'} eq 'construct') { push(@tools,63); } - if (($env{'environment.icons'} eq 'iconsonly') && + if (($env{'environment.icons'} eq 'iconsonly') && (grep(/^$idx$/,@tools))) { $inlineremote[$idx] = ''.$pic.''; @@ -1306,13 +1238,6 @@ sub secondlevel { return $output; } -sub openmenu { - my $menuname = &get_menu_name(); - unless ($env{'environment.remote'} eq 'on') { return ''; } - my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); - return "window.open(".$nothing.",'".$menuname."');"; -} - sub inlinemenu { undef(@inlineremote); undef(%category_members); @@ -1355,13 +1280,7 @@ sub rawconfig { # my $textualoverride=shift; my $output=''; - if ($env{'environment.remote'} eq 'on') { - $output.= - "window.status='Opening Remote Control';var swmenu=".&openmenu(). -"\nwindow.status='Configuring Remote Control ';"; - } else { - unless ($textualoverride) { return ''; } - } + return '' unless $textualoverride; my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; my $adv=$env{'user.adv'}; @@ -1380,7 +1299,10 @@ sub rawconfig { my $pub=($env{'request.state'} eq 'published'); my $con=($env{'request.state'} eq 'construct'); my $rol=$env{'request.role'}; - my $requested_domain = $env{'request.role.domain'}; + my $requested_domain; + if ($rol) { + $requested_domain = $env{'request.role.domain'}; + } foreach my $line (@desklines) { my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line); $prt=~s/\$uname/$uname/g; @@ -1394,7 +1316,13 @@ sub rawconfig { next if ($crstype ne 'Community'); $prt=~s/\$cmty/$crs/g; } - $prt=~s/\$requested_domain/$requested_domain/g; + if ($prt =~ m/\$requested_domain/) { + if ((!$requested_domain) && ($pro eq 'pbre') && ($env{'user.adv'})) { + $prt=~s/\$requested_domain/$env{'user.domain'}/g; + } else { + $prt=~s/\$requested_domain/$requested_domain/g; + } + } if ($category_names{$cat}!~/\w/) { $cat='oth'; } if ($pro eq 'clear') { $output.=&clear($row,$col); @@ -1430,8 +1358,9 @@ sub rawconfig { next; } } - if (&Apache::lonnet::allowed($priv,$prt)) { - $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + if ((($priv eq 'bre') && (&Apache::lonnet::allowed($priv,$prt) eq 'F')) || + (($priv ne 'bre') && (&Apache::lonnet::allowed($priv,$prt)))) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'course') { if (($env{'request.course.fn'}) && ($crstype ne 'Community')) { @@ -1536,18 +1465,12 @@ sub rawconfig { $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } - if ($env{'environment.remote'} eq 'on') { - $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';"; - if (&Apache::lonmsg::newmail()) { - $output.='swmenu.setstatus("you have","messages");'; - } - } return $output; } sub check_for_rcrs { my $showreqcrs = 0; - my @reqtypes = ('official','unofficial','community'); + my @reqtypes = ('official','unofficial','community','textbook'); foreach my $type (@reqtypes) { if (&Apache::lonnet::usertools_access($env{'user.name'}, $env{'user.domain'}, @@ -1567,28 +1490,6 @@ sub check_for_rcrs { return $showreqcrs; } -# ======================================================================= Close - -sub close { - unless ($env{'environment.remote'} eq 'on') { return ''; } - my $menuname = &get_menu_name(); - return(< -// - -ENDCLOSE -} - sub dc_popup_js { my %lt = &Apache::lonlocal::texthash( more => '(More ...)', @@ -1632,10 +1533,18 @@ function toggleCountdown() { return; } +function zeroTimer() { + if (confirm('Are you sure?')) { + document.getElementsByName('done')[0].value = 'true'; + document.getElementsByName('doneButton')[0].submit(); + } +} + END } sub utilityfunctions { + my ($httphost) = @_; my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0])); if ($currenturl =~ m{^/adm/wrapper/ext/} && $env{'request.external.querystring'} ) { @@ -1663,42 +1572,45 @@ sub utilityfunctions { my $end_page_annotate = &Apache::loncommon::end_page({'js_ready' => 1}); - my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'. - &mt('Switch server?'); + my $jumptores = &Apache::lonhtmlcommon::javascript_jumpto_resource(); my $esc_url=&escape($currenturl); my $esc_symb=&escape($currentsymb); my $countdown = &countdown_toggle_js(); -return (< 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". - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''; + if (@submenu > 0) { + $switcher = &create_submenu('','',$switchtext,\@submenu); + } } - return $role_selector; + return ($js,$form,$switcher); } sub get_all_courseroles { @@ -2048,6 +2002,7 @@ sub get_all_courseroles { push(@{$courseroles->{'st'}},keys(%sections_count)); $seccount->{'st'} = scalar(keys(%sections_count)); } + $seccount->{'st'} ++; # Increment for a section-less student role. my $rolehash = { 'roles' => $courseroles, 'seccount' => $seccount, @@ -2124,9 +2079,8 @@ sub jump_to_role { return <<"END";