--- loncom/interface/lonmenu.pm 2020/04/07 18:34:26 1.369.2.71.2.2 +++ loncom/interface/lonmenu.pm 2012/05/15 01:41:27 1.370 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.71.2.2 2020/04/07 18:34:26 raeburn Exp $ +# $Id: lonmenu.pm,v 1.370 2012/05/15 01:41:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,8 @@ # http://www.lon-capa.org/ # # +# There is one parameter controlling the action of this module: +# =head1 NAME @@ -33,8 +35,7 @@ Apache::lonmenu =head1 SYNOPSIS -Loads contents of /home/httpd/lonTabs/mydesk.tab, -used to generate inline menu, and Main Menu page. +Coordinates the response to clicking an image. This is part of the LearningOnline Network with CAPA project described at http://www.lon-capa.org. @@ -73,19 +74,10 @@ It is set to 'done' in the BEGIN block o =item @primary_menu The elements of this array reference arrays that are made up of the components -of those lines of mydesk.tab that start with prim:. +of those lines of mydesk.tab that start with prim. It is used by primary_menu() to generate the corresponding menu. It gets filled in the BEGIN block of this module. -=item %primary_sub_menu - -The keys of this hash reference are the names of items in the primary_menu array -which have sub-menus. For each key, the corresponding value is a reference to -an array containing components extracted from lines in mydesk.tab which begin -with primsub:. -This hash, which is used by primary_menu to generate sub-menus, is populated in -the BEGIN block. - =item @secondary_menu The elements of this array reference arrays that are made up of the components @@ -106,84 +98,19 @@ secondary_menu(). =item primary_menu() -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 +This routine evaluates @primary_menu and returns XHTML for the menu +that contains 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() Same as primary_menu() but operates on @secondary_menu. -=item create_submenu() - -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 -(no hover psuedo class) via LC_hoverable class for
  • tag for top- -level item, which employs jQuery to handle behavior on mouseover. - -Inputs: 6 - (a) link and (b) target for anchor href in top level item, - (c) title for text wrapped by anchor tag in top level item. - (d) reference to array of arrays of sub-menu items. - (e) boolean to indicate whether to call &mt() to translate - name of menu item, - (f) optional class for
  • element in primary menu, for which - sub menu is being generated. - -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,9 +129,6 @@ The javascript is usually similar to "go =item utilityfunctions() -Output from this routine is a number of javascript functions called by -items in the inline menu, and in some cases items in the Main Menu page. - =item serverform() =item constspaceform() @@ -235,7 +159,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 @secondary_menu); my @inlineremote; @@ -256,16 +180,15 @@ sub prep_menuitem { . qq| href="$$menuitem[0]" target="_top">$link
  • |; } -# 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() evaluates @primary_menu and returns XHTML for the menu +# that contains following links: +# 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, position) + # (link url, icon path, alt text, link text, condition) my $public; if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) { @@ -289,41 +212,8 @@ sub primary_menu { next if $$menuitem[4] eq 'courses' ##'Roles' wanted && !&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 '') { - $link = $menuitem->[0]; - $target = '_top'; - } else { - $link = '#'; - } - 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 'portfolio') || - ($item->[2] eq 'blog')) && - (!&Apache::lonnet::usertools_access('','',$item->[2], - undef,'tools'))); - push(@primsub,$item); - } - if (@primsub > 0) { - if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) { - $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); - } else { - $title = &mt($title); - } - $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1); - } elsif ($link) { - $menu{$position} .= '
  • '.&mt($title).'
  • '; - } - } - } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink + + if ($$menuitem[3] eq 'Help') { # special treatment for helplink if ($public) { my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'}; my $defdom = &Apache::lonnet::default_login_domain(); @@ -331,23 +221,19 @@ sub primary_menu { 'helpdeskmail', $defdom,$origmail); if ($to ne '') { - $menu{$position} .= &prep_menuitem($menuitem); + $menu .= &prep_menuitem($menuitem); } } else { - $menu{$position} .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; + $menu .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; } } else { - $menu{$position} .= prep_menuitem($menuitem); + $menu .= prep_menuitem($menuitem); } } - my @output = ('',''); - if ($menu{'left'} ne '') { - $output[0] = "
      $menu{'left'}
    "; - } - if ($menu{'right'} ne '') { - $output[1] = "
      $menu{'right'}
    "; - } - return @output; + $menu =~ s/\[domain\]/$env{'user.domain'}/g; + $menu =~ s/\[user\]/$env{'user.name'}/g; + + return "
      $menu
    "; } #returns hashref {user=>'',dom=>''} containing: @@ -376,7 +262,6 @@ sub getauthor{ } sub secondary_menu { - my ($httphost) = @_; my $menu; my $crstype = &Apache::loncommon::course_type(); @@ -384,151 +269,58 @@ sub secondary_menu { ? "/$env{'request.course.sec'}" : ''); my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'}); - my $canvieweditor = &Apache::lonnet::allowed('cev', $env{'request.course.id'}); - my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'}; - if ($canviewroster eq 'disabled') { - undef($canviewroster); - } - my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec); - my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); - my $canviewusers = &Apache::lonnet::allowed('vcl', $crs_sec); - my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec); - my $canviewpara = &Apache::lonnet::allowed('vpa', $crs_sec); + 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'}; - unless ($canedit || $canvieweditor) { - 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 || $canvgr) { - 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 'cca') + && $$menuitem[4] ne 'author' && !$env{'request.course.id'}; - next if $$menuitem[4] =~ /^crsedit/ - && (!$canedit && !$canvieweditor); - next if $$menuitem[4] eq 'crseditCourse' - && ($crstype eq 'Community'); - next if $$menuitem[4] eq 'crseditCommunity' - && ($crstype eq 'Course'); + next if $$menuitem[4] =~ /^mdc/ + && !$canedit; next if $$menuitem[4] eq 'nvgr' && $canvgr; next if $$menuitem[4] eq 'vgr' && !$canvgr; - next if $$menuitem[4] eq 'viewusers' - && !$canmodifyuser && !$canviewusers; - next if $$menuitem[4] eq 'noviewusers' - && ($canmodifyuser || $canviewusers || !$canviewroster); + next if $$menuitem[4] eq 'cst' + && !$canmodifyuser; + next if $$menuitem[4] eq 'ncst' + && $canmodifyuser; next if $$menuitem[4] eq 'mgr' && !$canmgr; - next if $$menuitem[4] eq 'showresv' - && !$showresv; + next if $$menuitem[4] eq 'nmgr' + && $canmgr; next if $$menuitem[4] eq 'whn' && !$canviewwnew; - next if $$menuitem[4] eq 'params' - && (!$canmodpara && !$canviewpara); - next if $$menuitem[4] eq 'nvcg' - && ($canviewgrps || !%groups); - next if $$menuitem[4] eq 'showsyllabus' - && !$showsyllabus; - next if $$menuitem[4] eq 'showfeeds' - && !$showfeeds; + next if $$menuitem[4] eq 'opa' + && !$canmodpara; + next if $$menuitem[4] =~ /showgroups$/ + && !$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})) { - 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 'vpa' && !$canviewpara); - next if ($item->[2] eq 'viewusers' && !($canmodifyuser || $canviewusers)); - next if ($item->[2] eq 'mgr' && !$canmgr); - next if ($item->[2] eq 'vcg' && !$canviewgrps); - next if ($item->[2] eq 'crsedit' && !$canedit && !$canvieweditor); - push(@scndsub,$item); - } - } - if (@scndsub > 0) { - $menu .= &create_submenu($link,$target,$title,\@scndsub,1); - } elsif ($link ne '#') { - $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 - ($roleswitcher_js,$roleswitcher_form,my $switcher) = - &roles_selector( + my $roles_selector = &roles_selector( $env{'course.' . $env{'request.course.id'} . '.domain'}, - $env{'course.' . $env{'request.course.id'} . '.num'}, - $httphost - ); - $menu .= $switcher; + $env{'course.' . $env{'request.course.id'} . '.num'} ); + + $menu .= $roles_selector ? "
  • $roles_selector
  • " + : ''; } 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); } } @@ -546,139 +338,18 @@ sub secondary_menu { my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; ($escurl = $env{'request.filename'}) =~ s{^\Q$londocroot\E}{}; $escurl = &escape($escurl); - } + } $menu =~ s/\[url\]/$escurl/g; $menu =~ s/\[symb\]/$escsymb/g; } $menu =~ s/\[uname\]/$$author{user}/g; $menu =~ s/\[udom\]/$$author{dom}/g; - if ($env{'request.course.id'}) { - $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,$translate,$addclass) = @_; - return unless (ref($submenu) eq 'ARRAY'); - my $disptarget; - if ($target ne '') { - $disptarget = ' target="'.$target.'"'; - } - my $menu = '
  • '. - ''. - ''.$title. - ''. - ' ▼'. - '
  • '; - - 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) = @_; - unless (@{$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;'; - } - - # 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 .= '
  • '; - } - } - } - 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'} ne 'on') || - ((($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; + return ""; } sub innerregister { - my ($forcereg,$bread_crumbs,$group,$pagebuttonshide) = @_; + my ($forcereg,$bread_crumbs) = @_; my $const_space = ($env{'request.state'} eq 'construct'); my $is_const_dir = 0; @@ -686,203 +357,231 @@ sub innerregister { $env{'request.registered'} = 1; - my $noremote = ($env{'environment.remote'} ne 'on'); - 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 ($mapurl,$resurl); - - 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 $resurl; + if ( $env{'request.symb'} && $env{'request.course.id'} ) { - my $maptitle = &Apache::lonnet::gettitle($mapurl); - my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread()); + (my $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()); #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; - my @tools; - if ($env{'request.filename'} =~ /\.page$/) { - my %breadcrumb_tools = &Apache::lonhtmlcommon::current_breadcrumb_tools(); - if (ref($breadcrumb_tools{'tools'}) eq 'ARRAY') { - @tools = @{$breadcrumb_tools{'tools'}}; - } - } - &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb(@crumbs); - if (@tools) { - &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',@tools); - } - } 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){ + 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){ #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(); - unless ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) { - &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); - } + &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'}); } - my $timesync = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' ); # ============================================================================= # ============================ This is for URLs that actually can be registered - if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) - || ($forcereg)) { + return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) + || $forcereg ); - my %swtext; - if ($noremote) { - %swtext = &get_inline_text(); - } else { - %swtext = &get_rc_text(); - } - my $hwkadd=''; +# -- 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 ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, - $forceview,$editbutton); - if (($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) || - ($env{'request.role'} !~/^(aa|ca|au)/)) { - if (($env{'environment.remote'} eq 'on') && ($env{'request.symb'})) { - &Apache::lonhtmlcommon::clear_breadcrumbs(); + my $hwkadd=''; + 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'); } - $editbutton = &prepare_functions($resurl,$forcereg,$group); - } - if ($editbutton eq '') { - $editbutton = &clear(6,1); - } - -# -# This applies in course context -# + } + 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'); + } + 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'}; - $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); - $perms{'cev'} = &Apache::lonnet::allowed('cev',$env{'request.course.id'}); - my @privs; - if ($env{'request.symb'} ne '') { - if ($env{'request.filename'}=~/$LONCAPA::assess_re/) { - push(@privs,('mgr','vgr')); + } + 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; } - push(@privs,('opa','vpa')); } - 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'}"); +# +# 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}; + + # 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; + } + } } } -# -# Determine whether or not to show Grades and Submissions buttons -# - 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'); + # 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 (($env{'request.symb'} ne '') && (($perms{'opa'}) || ($perms{'vpa'}))) { - $hwkadd .= &switch('','',7,3,'pparm.png','Content Settings', - 'parms[_2]',"gocmd('/adm/parmset','set')", - 'Content Settings'); + } + 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'); + } + } + } } -# End grades/submissions check - -# -# This applies to items inside a folder/page modifiable in the course. -# - if (($env{'request.symb'}=~/^uploaded/) && (($perms{'mdc'}) || ($perms{'cev'}))) { - my $text = 'Edit Folder'; - if (($mapurl =~ /\.page$/) || - ($env{'request.symb'}=~ - m{uploaded/$cdom/$cnum/default_\d+\.page$})) { - $text = 'Edit Page'; + } + 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'); + } } - $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 - my ($menuitems,$got_prt,$got_wishlist,$cstritems); + my $menuitems; if ($const_space) { # # We are in construction space @@ -894,9 +593,6 @@ sub innerregister { my $currdir = '/priv/'.$udom.'/'.$uname.'/'.$thisdisfn; if ($currdir =~ m-/$-) { $is_const_dir = 1; - if ($thisdisfn eq '') { - $is_const_dir = 2; - } } else { $currdir =~ s|[^/]+$||; my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn); @@ -911,42 +607,34 @@ s&6&3&pub.png&Publish&resource[_3]&gocst s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource s&7&2&prt.png&Print&printout[_1]&gocstr('/adm/printout','/priv/$udom/$uname/$cleandisfn')&Prepare a printable document ENDMENUITEMS - unless ($noremote) { - $cstritems = $menuitems; - 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 '' ) { # -# We are in a course and looking at a registered URL +# We are in a course and looking at a registred URL # Should probably be in mydesk.tab # - $menuitems=(< 0){ }else{ $menuitems.="anot.png"; } -$menuitems.="&$swtext{'anot'}&tations[_1]&annotate()&"; +$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|ext\.tool)(\?|$)/) { - if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/}) && ($env{'request.noversionuri'} !~ m{^/uploaded/$match_domain/$match_courseid/docs/})) { + unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) { + if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) { $menuitems.=(<[0]; - } - $buttonshide = $pagebuttonshide; - } else { - $countdown = &countdown_timer(); - $buttonshide = &hidden_button_check(); - } + if ($addremote) { - &Apache::lonhtmlcommon::clear_breadcrumb_tools(); + &Apache::lonhtmlcommon::clear_breadcrumb_tools(); - &Apache::lonhtmlcommon::add_breadcrumb_tool( - 'navigation', @inlineremote[21,23]); + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'navigation', @inlineremote[21,23]); - if ($buttonshide eq 'yes') { - if ($countdown) { - &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown); - } - } else { - my @tools = @inlineremote[93,91,81,82,83]; - if ($countdown) { - unshift(@tools,$countdown); - } - &Apache::lonhtmlcommon::add_breadcrumb_tool( - 'tools',@tools); + if(hidden_button_check() ne 'yes') { + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'tools', @inlineremote[93,91,81,82,83]); - #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); - } + #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]); + } + + unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) { + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'advtools', @inlineremote[61,71,72,73,74,92]); } - my ($topic_help,$topic_help_text); - if ($is_const_dir == 2) { - if ((($ENV{'SERVER_PORT'} == 443) || - ($Apache::lonnet::protocol{$Apache::lonnet::perlvar{'lonHostID'}} eq 'https')) && - (&Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},'webdav'))) { - $topic_help = 'Authoring_WebDAV,Authoring_WebDAV_Mac_10v6,Authoring_WebDAV_Mac_10v10,'. - 'Authoring_WebDAV_Windows_v7,Authoring_WebDAV_Linux_Centos'; - $topic_help_text = 'About WebDAV access'; - } - } - return &Apache::lonhtmlcommon::scripttag('', 'start') - . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'','','','',$topic_help,$topic_help_text) - . &Apache::lonhtmlcommon::scripttag('', 'end'); - - } else { - my $cstrcrumbs; - if ($const_space) { - foreach (split(/\n/,$cstritems)) { - my ($command,@rest)=split(/\&/,$_); - my $idx=10*$rest[0]+$rest[1]; - &switch('','',@rest); - } - &Apache::lonhtmlcommon::add_breadcrumb_tool('advtools', - @inlineremote[63,61,71,72]); - - $cstrcrumbs = &Apache::lonhtmlcommon::scripttag('', 'start') - .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0) - .&Apache::lonhtmlcommon::scripttag('', 'end'); - } - my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0])); - $requri=&Apache::lonenc::check_encrypt(&unescape($requri)); - my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'}); - my $navstatus=&get_nav_status(); - my $clearcstr; - - if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; } - return < -// - - -$cstrcrumbs -ENDREGTHIS - } - } else { - unless ($noremote) { -# Not registered, graphical - return (< -// - -ENDDONOTREGTHIS - } - return ''; } -} - -sub get_inline_text { - my %text = ( - pgrd => 'Content Grades', - subm => 'Content Submissions', - pparm => 'Content Settings', - docs => 'Folder/Page Content', - pcstr => 'Edit', - prt => 'Print', - alnk => 'Stored Links', - anot => 'Notes', - catalog => 'Info', - eval => 'Evaluate', - fdbk => 'Feedback', - ); - return %text; -} - -sub get_rc_text { - my %text = ( - pgrd => 'problem[_1]', - subm => 'view sub-[_1]', - pparm => 'problem[_2]', - pcstr => 'edit[_1]', - prt => 'prepare[_1]', - back => 'backward[_1]', - forw => 'forward[_1]', - alnk => 'add to[_1]', - anot => 'anno-[_1]', - catalog => 'catalog[_2]', - eval => 'evaluate[_1]', - fdbk => 'feedback[_1]', - ); - return %text; -} - -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 (''); - } -# -# 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);'); -} - - -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 ''; + return &Apache::lonhtmlcommon::scripttag('', 'start') + . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0) + . &Apache::lonhtmlcommon::scripttag('', 'end'); } -sub get_editbutton { - my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg) = @_; - my $jscall; - if (($forceview) && ($env{'form.todocs'})) { - my ($folderpath,$command,$navmap); - if ($env{'request.symb'}) { - $folderpath = &Apache::loncommon::symb_to_docspath($env{'request.symb'},\$navmap); - } 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 { - my $suppanchor; - if ($env{'form.folderpath'}) { - $suppanchor = $env{'form.anchor'}; - } - $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'}, - $suppanchor); - } - if ($jscall) { - my $icon = 'pcstr.png'; - my $label = 'Edit'; - if ($forceview) { - $icon = 'tolastloc.png'; - $label = 'Exit Editing'; - } - my $infunc = 1; - my $clearbutton; - if ($env{'environment.remote'} eq 'on') { - if ($cfile =~ m{^/priv/}) { - undef($infunc); - $label = 'edit'; - } else { - $clearbutton = 1; - } - } - my $editor = &switch('','',6,1,$icon,$label,'resource[_2]', - $jscall,"Edit this resource",'','',$infunc); - if ($infunc) { - return 1; - } elsif ($clearbutton) { - return &clear(6,1); - } else { - return $editor; - } +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 prepare_functions { - my ($resurl,$forcereg,$group,$bread_crumbs,$advtools,$docscrumbs,$forbodytag) = @_; - 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 =~ m{^/?public/$cdom/$cnum/syllabus}) || - ($resurl =~ m{^/?uploaded/$cdom/$cnum/portfolio/syllabus/}))) { - if ($resurl =~ m{^/}) { - $cfile = $resurl; - } else { - $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); - } - } - } - } -# End determination of 'Edit' icon/button display - - 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','','',1); - } - 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','','',1); - } - if ($perms{'vgr'}) { - &switch('','',6,6,'rsrv-22x22.png','Reservations', - '', - "go('/adm/slotrequest?command=showresv&origin=aboutme&uname=$sname&udom=$sdom')", - 'Slot reservation history','','',1); - } - if ($perms{'srm'}) { - &switch('','',6,7,'contact-new-22x22.png','Records', - '', - "go('/adm/email?recordftf=retrieve&recname=$sname&recdom=$sdom')", - 'Add records','','',1); - } - } - } - if (($env{'form.folderpath'} =~ /^supplemental/) && - (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && - (($resurl =~ m{^/adm/wrapper/ext/}) || - ($resurl =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) || - ($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 $suppanchor; - if ($resurl =~ m{^/adm/wrapper/ext/}) { - $suppanchor = $env{'form.anchor'}; - } - 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&anchor=$suppanchor'", - 'Folder/Page Content','','',1); +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'; } } - } - -# 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'}) && (!ref($forbodytag))) { - 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); - if (ref($forbodytag)) { - $$forbodytag = - &Apache::lonhtmlcommon::scripttag('', 'start') - .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0) - .&Apache::lonhtmlcommon::scripttag('', 'end'); - } - return; + if ($dest) { + $cfile = &HTML::Entities::encode($dest,'"<>&'); } } -} - -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 $cfile; } # ================================================================== 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 @@ -1672,7 +774,7 @@ sub clear { # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)". sub switch { - my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak,$infunc)=@_; + my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak)=@_; $act=~s/\$uname/$uname/g; $act=~s/\$udom/$udom/g; $top=&mt($top); @@ -1681,24 +783,6 @@ sub switch { my $idx=10*$row+$col; $category_members{$cat}.=':'.$idx; - if (($env{'environment.remote'} eq 'on') && (!$infunc)) { - if (($row<1) || ($row>13)) { return ''; } - if ($env{'request.state'} eq 'construct') { - my $text = $top.' '.$bot; - $text=~s/\s*\-\s*//gs; - my $pic = ''.$text.''; - $inlineremote[$idx] = - ''. - $pic.''.$top.' '; - } -# 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; @@ -1729,19 +813,9 @@ sub switch { } } else { # Inline Menu - my @tools = (93,91,81,82,83); - unless ($env{'request.state'} eq 'construct') { - push(@tools,63); - } - if (($env{'environment.icons'} eq 'iconsonly') && - (grep(/^$idx$/,@tools))) { - $inlineremote[$idx] = - ''.$pic.''; - } else { - $inlineremote[$idx] = + $inlineremote[$idx]= ''.$pic. ''.$top.' '; - } } return ''; } @@ -1760,13 +834,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); @@ -1809,13 +876,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'}; @@ -1834,10 +895,7 @@ sub rawconfig { my $pub=($env{'request.state'} eq 'published'); my $con=($env{'request.state'} eq 'construct'); my $rol=$env{'request.role'}; - my $requested_domain; - if ($rol) { - $requested_domain = $env{'request.role.domain'}; - } + my $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; @@ -1851,13 +909,7 @@ sub rawconfig { next if ($crstype ne 'Community'); $prt=~s/\$cmty/$crs/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; - } - } + $prt=~s/\$requested_domain/$requested_domain/g; if ($category_names{$cat}!~/\w/) { $cat='oth'; } if ($pro eq 'clear') { $output.=&clear($row,$col); @@ -1893,9 +945,8 @@ sub rawconfig { next; } } - 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); + if (&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')) { @@ -2000,18 +1051,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','textbook'); + my @reqtypes = ('official','unofficial','community'); foreach my $type (@reqtypes) { if (&Apache::lonnet::usertools_access($env{'user.name'}, $env{'user.domain'}, @@ -2031,28 +1076,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 ...)', @@ -2078,240 +1101,7 @@ END } -sub countdown_toggle_js { - return <<"END"; - -function toggleCountdown() { - var countdownid = document.getElementById('duedatecountdown'); - var currstyle = countdownid.style.display; - if (currstyle == 'inline') { - countdownid.style.display = 'none'; - document.getElementById('ddcountcollapse').innerHTML=''; - document.getElementById('ddcountexpand').innerHTML='◄ '; - } else { - countdownid.style.display = 'inline'; - document.getElementById('ddcountcollapse').innerHTML='► '; - document.getElementById('ddcountexpand').innerHTML=''; - } - return; -} - -END -} - -# This creates a "done button" for timed events. The confirmation box is a jQuery -# dialog widget. If the interval parameter requires a proctor key for the timed -# event to be marked done, there will also be a textbox where that can be entered. -# Clicking OK will set the value of LC_interval_done to 'true', and, if needed will -# set the value of LC_interval_done_proctorpass to the text entered in that box, -# and submit the corresponding form. -# -# The &zero_time() routine in lonhomework.pm is called when a page is rendered if -# LC_interval_done is true. -# -sub done_button_js { - my ($type,$width,$height,$proctor,$donebuttontext) = @_; - return unless (($type eq 'map') || ($type eq 'resource')); - my %lt = &Apache::lonlocal::texthash( - title => 'WARNING!', - preamble => 'You are trying to end this timed event early.', - map => 'Confirming that you are done will cause the time to expire and prevent you from changing any answers in the current folder.', - resource => 'Confirming that you are done will cause the time to expire for this question, and prevent you from changing your answer(s).', - okdone => 'Click "OK" if you are completely finished.', - cancel => 'Click "Cancel" to continue working.', - proctor => 'Ask a proctor to enter the key, then click "OK" if you are completely finished.', - ok => 'OK', - exit => 'Cancel', - key => 'Key:', - nokey => 'A proctor key is required', - ); - my $navmap = Apache::lonnavmaps::navmap->new(); - my ($missing,$tried) = (0,0); - if (ref($navmap)) { - my @resources=(); - if ($type eq 'map') { - my ($mapurl,$rid,$resurl)=&Apache::lonnet::decode_symb($env{'request.symb'}); - if ($env{'request.symb'} =~ /\.page$/) { - @resources=$navmap->retrieveResources($resurl,sub { $_[0]->is_problem() }); - } else { - @resources=$navmap->retrieveResources($mapurl,sub { $_[0]->is_problem() }); - } - } else { - my $res = $navmap->getBySymb($env{'request.symb'}); - if (ref($res)) { - if ($res->is_problem()) { - push(@resources,$res); - } - } - } - foreach my $res (@resources) { - if (ref($res->parts()) eq 'ARRAY') { - foreach my $part (@{$res->parts()}) { - if (!$res->tries($part)) { - $missing++; - } else { - $tried++; - } - } - } - } - } - if ($missing) { - $lt{'miss'} .= '

    '; - if ($type eq 'map') { - $lt{'miss'} .= &mt('Submissions are missing for [quant,_1,question part,question parts] in this folder.',$missing); - } else { - $lt{'miss'} .= &mt('Submissions are missing for [quant,_1,part] in this question.',$missing); - } - if ($missing > 1) { - $lt{'miss'} .= ' '.&mt('If you confirm you are done you will be unable to submit answers for them.').''; - } else { - $lt{'miss'} .= ' '.&mt('If you confirm you are done you will be unable to submit an answer for it.').'

    '; - } - } - $donebuttontext = &HTML::Entities::encode($donebuttontext,'<>&"'); - if ($proctor) { - if ($height !~ /^\d+$/) { - $height = 400; - if ($missing) { - $height += 60; - } - } - if ($width !~ /^\d+$/) { - $width = 400; - if ($missing) { - $width += 60; - } - } - return < - - - - - -
    -

    $lt{'preamble'} $lt{$type}

    - $lt{'miss'} -

    $lt{'proctor'}

    -
    - - -
    -

    $lt{'cancel'}

    -
    - - - -END - } else { - if ($height !~ /^\d+$/) { - $height = 320; - if ($missing) { - $height += 60; - } - } - if ($width !~ /^\d+$/) { - $width = 320; - if ($missing) { - $width += 60; - } - } - if ($missing) { - $lt{'miss'} = '

    '.$lt{'miss'}.'

    '; - } - return < - - - - -

    -

    $lt{'preamble'} $lt{$type} $lt{'miss'} $lt{'okdone'} $lt{'cancel'}

    -
    - - - -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'} ) { @@ -2339,45 +1129,40 @@ sub utilityfunctions { my $end_page_annotate = &Apache::loncommon::end_page({'js_ready' => 1}); - my $jumptores = &Apache::lonhtmlcommon::javascript_jumpto_resource(); + my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'. + &mt('Switch server?'); my $esc_url=&escape($currenturl); my $esc_symb=&escape($currentsymb); - my $countdown = &countdown_toggle_js(); - - my $hostvar = ' -function setLCHost() { - var lcHostname=""; -'; - if ($httphost =~ m{^https?\://}) { - $hostvar .= ' var lcServer="'.$httphost.'";'."\n". - ' var hostReg = /^https?:\/\/([^\/]+)$/i;'."\n". - ' var match = hostReg.exec(lcServer);'."\n". - ' if (match.length) {'."\n". - ' if (match[1] == location.hostname) {'."\n". - ' lcHostname=lcServer;'."\n". - ' }'."\n". - ' }'."\n"; - } - - $hostvar .= ' return lcHostname;'."\n". -'}'."\n"; - return (<{$destination})) { - if ($reqprivs->{$destination} =~ /,/) { - @{$privref} = split(/,/,$reqprivs->{$destination}); - } else { - $privref = [$reqprivs->{$destination}]; - } + $priv = $reqprivs->{$destination}; } } if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) { my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}); + if ((($start) && ($start<0)) || (($end) && ($end<$now)) || (($start) && ($now<$start))) { @@ -2615,9 +1348,7 @@ sub roles_selector { } } if ($is_cc) { - &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs); - } elsif ($env{'request.role'} =~ m{^\Qcr/$cdom/$cdom-domainconfig/\E(\w+)\.\Q/$cdom/$cnum\E}) { - &get_customadhoc_roles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs,\%roledesc,$privref); + &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount,\%courseprivs,$priv); } else { my %gotnosection; foreach my $item (keys(%env)) { @@ -2633,7 +1364,7 @@ sub roles_selector { $gotnosection{$role} = 1; } } - if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0)) { + if ($priv ne '') { my $cnumsec = $cnum; if ($sec ne '') { $cnumsec .= "/$sec"; @@ -2662,74 +1393,37 @@ sub roles_selector { } } } + my $switchtext; + if ($crstype eq 'Community') { + $switchtext = &mt('Switch community role to...') + } else { + $switchtext = &mt('Switch course role to...') + } my @roles_order = ($ccrole,'in','ta','ep','ad','st'); - my $numdiffsec; - if (keys(%seccount) == 1) { - foreach my $key (keys(%seccount)) { - $numdiffsec = $seccount{$key}; - } - } - if ((keys(%seccount) > 1) || ($numdiffsec > 1)) { - my @submenu; - $js = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,\%roledesc,$privref); - $form = - '
    '."\n". - ' '."\n". - ' '."\n". - ' '."\n". - ' '."\n"; - if ($destsymb ne '') { - $form .= ' '."\n"; - } - $form .= '
    '."\n"; + if (keys(%courseroles) > 1) { + $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv); + $role_selector .= '
    + '."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
    '; } - return ($js,$form,$switcher); + return $role_selector; } sub get_all_courseroles { @@ -2792,7 +1486,6 @@ 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, @@ -2802,101 +1495,8 @@ sub get_all_courseroles { return; } -sub get_customadhoc_roles { - my ($cdom,$cnum,$courseroles,$seccount,$courseprivs,$roledesc,$privref) = @_; - unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH') && - (ref($courseprivs) eq 'HASH') && (ref($roledesc) eq 'HASH')) { - return; - } - my $is_helpdesk = 0; - my $now = time; - foreach my $role ('dh','da') { - if ($env{"user.role.$role./$cdom/"}) { - my ($start,$end)=split(/\./,$env{"user.role.$role./$cdom/"}); - if (!($start && ($now<$start)) && !($end && ($now>$end))) { - $is_helpdesk = 1; - last; - } - } - } - if ($is_helpdesk) { - my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($cdom.'_'.$cnum); - my %available; - if (ref($possroles) eq 'ARRAY') { - map { $available{$_} = 1; } @{$possroles}; - } - my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); - if (ref($domdefaults{'adhocroles'}) eq 'HASH') { - if (keys(%{$domdefaults{'adhocroles'}})) { - my $numsec = 1; - my @sections; - my ($allseclist,$cached) = - &Apache::lonnet::is_cached_new('courseseclist',$cdom.'_'.$cnum); - if (defined($cached)) { - if ($allseclist ne '') { - @sections = split(/,/,$allseclist); - $numsec += scalar(@sections); - } - } else { - my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); - @sections = sort(keys(%sections_count)); - $numsec += scalar(@sections); - $allseclist = join(',',@sections); - &Apache::lonnet::do_cache_new('courseseclist',$cdom.'_'.$cnum,$allseclist); - } - my (%adhoc,$gotprivs); - my $prefix = "cr/$cdom/$cdom".'-domainconfig'; - foreach my $role (keys(%{$domdefaults{'adhocroles'}})) { - next if (($role eq '') || ($role =~ /\W/)); - $seccount->{"$prefix/$role"} = $numsec; - $roledesc->{"$prefix/$role"} = $description->{$role}; - if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0)) { - if (exists($env{"user.priv.$prefix/$role./$cdom/$cnum./"})) { - $courseprivs->{"$prefix/$role./$cdom/$cnum./"} = - $env{"user.priv.$prefix/$role./$cdom/$cnum./"}; - $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"} = - $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/"}; - $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"} = - $env{"user.priv.$prefix/$role./$cdom/$cnum./$cdom/$cnum"}; - } else { - unless ($gotprivs) { - my ($adhocroles,$privscached) = - &Apache::lonnet::is_cached_new('adhocroles',$cdom); - if ((defined($privscached)) && (ref($adhocroles) eq 'HASH')) { - %adhoc = %{$adhocroles}; - } else { - my $confname = &Apache::lonnet::get_domainconfiguser($cdom); - my %roledefs = &Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_'); - foreach my $key (keys(%roledefs)) { - (undef,my $rolename) = split(/_/,$key); - if ($rolename ne '') { - my ($systempriv,$domainpriv,$coursepriv) = split(/\_/,$roledefs{$key}); - $coursepriv = &Apache::lonnet::course_adhocrole_privs($rolename,$cdom,$cnum,$coursepriv); - $adhoc{$rolename} = join('_',($systempriv,$domainpriv,$coursepriv)); - } - } - &Apache::lonnet::do_cache_new('adhocroles',$cdom,\%adhoc); - } - $gotprivs = 1; - } - ($courseprivs->{"$prefix/$role./$cdom/$cnum./"}, - $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/"}, - $courseprivs->{"$prefix/$role./$cdom/$cnum./$cdom/$cnum"}) = - split(/\_/,$adhoc{$role}); - } - } - if ($available{$role}) { - $courseroles->{"$prefix/$role"} = \@sections; - } - } - } - } - } - return; -} - sub jump_to_role { - my ($cdom,$cnum,$seccount,$courseroles,$courseprivs,$roledesc,$privref) = @_; + my ($cdom,$cnum,$seccount,$courseroles,$courseprivs,$priv) = @_; my %lt = &Apache::lonlocal::texthash( this => 'This role has section(s) associated with it.', ente => 'Enter a specific section.', @@ -2929,26 +1529,29 @@ sub jump_to_role { } } my $checkroles = 0; - if ((ref($privref) eq 'ARRAY') && (@{$privref} > 0) && (ref($courseprivs) eq 'HASH')) { - my %disallowed; + if ($priv && ref($courseprivs) eq 'HASH') { + my (%disallowed,%allowed,@disallow); foreach my $role (sort(keys(%{$courseprivs}))) { my $trole; if ($role =~ m{^(.+?)\Q./$cdom/$cnum\E}) { $trole = $1; } if (($trole ne '') && ($trole ne 'cm')) { - $disallowed{$trole} = 1; - foreach my $priv (@{$privref}) { - if ($courseprivs->{$role} =~ /\Q:$priv\E($|:|\&\w+)/) { - delete($disallowed{$trole}); - last; - } + if ($courseprivs->{$role} =~ /\Q:$priv\E($|:|\&\w+)/) { + $allowed{$trole} = 1; + } else { + $disallowed{$trole} = 1; } } } - if (keys(%disallowed) > 0) { + foreach my $trole (keys(%disallowed)) { + unless ($allowed{$trole}) { + push(@disallow,$trole); + } + } + if (@disallow > 0) { $checkroles = 1; - $js .= " var disallow = new Array('".join("','",keys(%disallowed))."');\n". + $js .= " var disallow = new Array('".join("','",@disallow)."');\n". " var rolecheck = 1;\n"; } } @@ -2959,8 +1562,9 @@ sub jump_to_role { return <<"END";