--- loncom/interface/lonmenu.pm 2012/08/07 01:35:47 1.369.2.20 +++ loncom/interface/lonmenu.pm 2012/11/27 23:45:08 1.393 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.20 2012/08/07 01:35:47 raeburn Exp $ +# $Id: lonmenu.pm,v 1.393 2012/11/27 23:45:08 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -117,9 +117,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. @@ -131,26 +131,6 @@ Inputs: 4 - (a) link and (b) target for 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 +182,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; @@ -267,10 +247,10 @@ 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 '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 'portfolio') || + ($item->[2] eq 'blog')) && (!&Apache::lonnet::usertools_access('','',$item->[2], undef,'tools'))); push(@primsub,$item); @@ -338,12 +318,12 @@ 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); + 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 %groups = &Apache::lonnet::get_active_groups( @@ -359,10 +339,6 @@ sub secondary_menu { && !$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' @@ -379,45 +355,19 @@ sub secondary_menu { && !$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 'author' && !$author; - 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( $env{'course.' . $env{'request.course.id'} . '.domain'}, $env{'course.' . $env{'request.course.id'} . '.num'} ); - $menu .= $roles_selector ? "
  • $roles_selector
  • " + $menu .= $roles_selector ? "
  • $roles_selector
  • " : ''; } else { $menu .= &prep_menuitem(\@$menuitem); @@ -443,8 +393,10 @@ sub secondary_menu { } $menu =~ s/\[uname\]/$$author{user}/g; $menu =~ s/\[udom\]/$$author{dom}/g; - - return ""; + if ($menu) { + $menu = ""; + } + return $menu; } sub create_submenu { @@ -455,7 +407,7 @@ sub create_submenu { $disptarget = ' target="'.$target.'"'; } my $menu = '
  • '. - ''. + ''. ''.&mt($title). ''. ' ▼'. @@ -478,36 +430,8 @@ sub create_submenu { 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,248 +439,150 @@ sub innerregister { $env{'request.registered'} = 1; - my $noremote = ($env{'environment.remote'} eq 'off'); - undef(@inlineremote); - my $reopen=&Apache::lonmenu::reopenmenu(); + my ($mapurl,$resurl); - 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, 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'}; + } + if ($env{'form.folderpath'}) { + my $editbutton = + &prepare_functions($resurl,$forcereg,$group,undef,undef,1); + my ($trail) = + &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + return $trail; + } else { + &Apache::lonhtmlcommon::add_breadcrumb( + {text => "Supplemental $crstype Content", + href => "javascript:gopost('/adm/supplemental','')"}); + $title = &mt('View Resource'); + return &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } + } + &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 - if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) - || ($forcereg)) { -# -- 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; + return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) + || $forcereg ); + my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit, + $forceview,$editbutton); + if (($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) || + ($env{'request.role'} !~/^(aa|ca|au)/)) { + $editbutton = &prepare_functions($resurl,$forcereg,$group); + } + if ($editbutton eq '') { + &clear(6,1); + } - my %swtext; - if ($noremote) { - %swtext = &get_inline_text(); - } else { - %swtext = &get_rc_text(); - } - my $hwkadd=''; - if ($env{'request.symb'} ne '' && - $env{'request.filename'}=~/$LONCAPA::assess_re/) { - if (&Apache::lonnet::allowed('mgr',$crs)) { - $hwkadd.=&switch('','',7,2,'pgrd.png',$swtext{'pgrd'},'grades[_4]', - "gocmd('/adm/grades','gradingmenu')", - 'Content Grades'); - } elsif (&Apache::lonnet::allowed('vgr',$crs)) { - $hwkadd.=&switch('','',7,2,'subm.png',$swtext{'subm'},'missions[_1]', - "gocmd('/adm/grades','submission')", - 'Content Submissions'); +# +# 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'}"); } + } +# +# Determine whether or not to show Grades and Submissions buttons +# + if ($env{'request.symb'} ne '' && + $env{'request.filename'}=~/$LONCAPA::assess_re/) { + if ($perms{'mgr'}) { + &switch('','',7,2,'pgrd.png','Content Grades','grades[_4]', + "gocmd('/adm/grades','gradingmenu')", + 'Content Grades'); + } elsif ($perms{'vgr'}) { + &switch('','',7,2,'subm.png','Content Submissions','missions[_1]', + "gocmd('/adm/grades','submission')", + 'Content Submissions'); + } + } + if (($env{'request.symb'} ne '') && ($perms{'opa'})) { + &switch('','',7,3,'pparm.png','Content Settings','parms[_2]', + "gocmd('/adm/parmset','set')", + 'Content Settings'); } - if ($env{'request.symb'} ne '' && - &Apache::lonnet::allowed('opa',$crs)) { - $hwkadd.=&switch('','',7,3,'pparm.png',$swtext{'pparm'},'parms[_2]', - "gocmd('/adm/parmset','set')", - 'Content Settings'); - } - if ($noremote) { - if ($env{'request.symb'}=~/^uploaded/ && - &Apache::lonnet::allowed('mdc',$crs)) { - $hwkadd.=&switch('','',7,4,'docs.png',$swtext{'docs'},'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) { +# End grades/submissions check - $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; - } - } - } - } - # 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',$swtext{'pcstr'},'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',$swtext{'pcstr'}, - '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',$swtext{'pcstr'}, - '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$/) { + $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) { @@ -778,11 +604,11 @@ sub innerregister { # Probably should 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"; 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); } - } else { - unless ($noremote) { -# Not registered, graphical - return (< -// - -ENDDONOTREGTHIS - + 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 = + &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'})); + if ($jscall) { + my $icon = 'pcstr.png'; + my $label = 'Edit'; + if ($forceview) { + $icon = 'tolastloc.png'; + $label = 'Exit Editing'; } - return ''; - } -} - -sub get_inline_text { - my %text = ( - pgrd => 'Content Grades', - subm => 'Content Submissions', - pparm => 'Content Settings', - docs => 'Folder/Page Content', - pcstr => 'Edit', - list => 'Directory', - rtrv => 'Retrieve', - pub => 'Publish', - del => 'Delete', - 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]', - list => 'list[_1]', - rtrv => 'retrieve[_1]', - pub => 'publish[_1]', - del => 'delete[_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 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/})) { + &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 (($resurl eq "/public/$cdom/$cnum/syllabus") && ($perms{'mdc'})) { + if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) { + &switch('','',6,1,'pcstr.png','Edit', + 'resource[_2]', + "go('/adm/courseprefs?phase=display&actions=courseinfo')", + 'Edit this resource'); + $editbutton = 1; + } 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/($match_domain)/($match_username)/aboutme$}) { + 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; -} - -sub loadevents() { - if ($env{'request.state'} eq 'construct' || - $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } - return 'LONCAPAreg();'; -} +# End determination of 'Edit' icon/button display -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'); + } + } + } elsif ($resurl =~ m{^/?adm/viewclasslist}) { +# This applies to viewclasslist page for users in a course + if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) { + &switch('','',6,4,'pparm.png','Settings', + '', + "go('/adm/courseprefs?actions=classlists&phase=display')", + 'Student-viewable classlist options'); + } + } + if (($env{'form.folderpath'} =~ /^supplemental/) && + (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && + (($resurl =~ m{^/adm/wrapper/ext/}) || + ($resurl =~ m{^/uploaded/$cdom/$cnum/supplemental/}) || + ($resurl eq '/adm/supplemental'))) { + my @folders=split('&',$env{'form.folderpath'}); + if (@folders > 2) { + 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[64]); + } } - # ================================================================== 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 @@ -1300,14 +981,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; @@ -1342,7 +1015,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.''; @@ -1369,13 +1042,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); @@ -1418,13 +1084,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'}; @@ -1599,12 +1259,6 @@ 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; } @@ -1630,28 +1284,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 ...)', @@ -1726,8 +1358,7 @@ 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); @@ -1742,22 +1373,7 @@ return (<'.&Apache::lonnet::plaintext($role).''; } } - $role_selector .= ''."\n". + $role_selector .= ''."\n"; + if ($destsymb ne '') { + $role_selector .= ''."\n"; + } + $role_selector .= ''."\n". ''."\n". @@ -2296,8 +1921,27 @@ sub required_privs { sub countdown_timer { if (($env{'request.course.id'}) && ($env{'request.symb'} ne '') && - ($env{'request.filename'}=~/$LONCAPA::assess_re/) && - ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) { + ($env{'request.filename'}=~/$LONCAPA::assess_re/)) { + my ($type,$hastimeleft,$slothastime); + my $now = time; + if ($env{'request.filename'} =~ /\.task$/) { + $type = 'Task'; + } else { + $type = 'problem'; + } + my ($status,$accessmsg,$slot_name,$slot) = + &Apache::lonhomework::check_slot_access('0',$type); + if ($slot_name ne '') { + if (ref($slot) eq 'HASH') { + if (($slot->{'starttime'} < $now) && + ($slot->{'endtime'} > $now)) { + $slothastime = 1; + } + } + } + if ($status ne 'CAN_ANSWER') { + return; + } my $duedate = &Apache::lonnet::EXT("resource.0.duedate"); my @interval=&Apache::lonnet::EXT("resource.0.interval"); my $hastimeleft; @@ -2310,9 +1954,11 @@ sub countdown_timer { } } if (($duedate && $duedate > time) || - (!$duedate && $hastimeleft)) { + (!$duedate && $hastimeleft) || + ($slot_name ne '' && $slothastime)) { my ($collapse,$expand,$alttxt,$title,$currdisp); - if (@interval > 1 && $hastimeleft) { + if ((@interval > 1 && $hastimeleft) || + ($type eq 'Task' && $slothastime)) { $currdisp = 'inline'; $collapse = '► '; } else { @@ -2364,9 +2010,6 @@ BEGIN { } elsif ($configline=~/^scnd\:/) { my @entries = (split(/\:/, $configline))[1..5]; push @secondary_menu, \@entries; - } elsif ($configline=~/^scndsub\:/) { - my ($parent,@entries) = (split(/\:/, $configline))[1..4]; - push (@{$secondary_submenu{$parent}},\@entries); } elsif ($configline) { push(@desklines,$configline); }