--- loncom/interface/lonmenu.pm 2016/10/22 20:52:37 1.369.2.59 +++ loncom/interface/lonmenu.pm 2017/06/21 19:54:58 1.369.2.71.4.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.59 2016/10/22 20:52:37 raeburn Exp $ +# $Id: lonmenu.pm,v 1.369.2.71.4.1 2017/06/21 19:54:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -384,6 +384,7 @@ 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); @@ -402,7 +403,7 @@ sub secondary_menu { if ($env{'request.course.id'}) { $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - unless ($canedit) { + 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'}) || @@ -415,7 +416,7 @@ sub secondary_menu { $showfeeds = 1; } } - unless ($canmgr) { + unless ($canmgr || $canvgr) { my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom); if (keys(%slots) > 0) { $showresv = 1; @@ -445,20 +446,20 @@ sub secondary_menu { next if $$menuitem[4] ne 'always' && ($$menuitem[4] ne 'author' && $$menuitem[4] ne 'cca') && !$env{'request.course.id'}; - next if $$menuitem[4] =~ /^mdc/ - && !$canedit; - next if $$menuitem[4] eq 'mdcCourse' + next if $$menuitem[4] =~ /^crsedit/ + && (!$canedit && !$canvieweditor); + next if $$menuitem[4] eq 'crseditCourse' && ($crstype eq 'Community'); - next if $$menuitem[4] eq 'mdcCommunity' + next if $$menuitem[4] eq 'crseditCommunity' && ($crstype eq 'Course'); next if $$menuitem[4] eq 'nvgr' && $canvgr; next if $$menuitem[4] eq 'vgr' && !$canvgr; - next if $$menuitem[4] eq 'cst' + next if $$menuitem[4] eq 'viewusers' && !$canmodifyuser && !$canviewusers; - next if $$menuitem[4] eq 'ncst' - && ($canmodifyuser || !$canviewusers || !$canviewroster); + next if $$menuitem[4] eq 'noviewusers' + && ($canmodifyuser || $canviewusers || !$canviewroster); next if $$menuitem[4] eq 'mgr' && !$canmgr; next if $$menuitem[4] eq 'showresv' @@ -494,10 +495,10 @@ sub secondary_menu { 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 'cst' && !$canmodifyuser); + 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 'mdc' && !$canedit); + next if ($item->[2] eq 'crsedit' && !$canedit && !$canvieweditor); push(@scndsub,$item); } } @@ -545,7 +546,7 @@ 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; } @@ -677,7 +678,7 @@ sub registerurl { } sub innerregister { - my ($forcereg,$bread_crumbs,$group) = @_; + my ($forcereg,$bread_crumbs,$group,$pagebuttonshide) = @_; my $const_space = ($env{'request.state'} eq 'construct'); my $is_const_dir = 0; @@ -823,6 +824,7 @@ sub innerregister { $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/) { @@ -864,7 +866,7 @@ sub innerregister { # # This applies to items inside a folder/page modifiable in the course. # - if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) { + if (($env{'request.symb'}=~/^uploaded/) && (($perms{'mdc'}) || ($perms{'cev'}))) { my $text = 'Edit Folder'; if (($mapurl =~ /\.page$/) || ($env{'request.symb'}=~ @@ -1031,22 +1033,24 @@ ENDMENUITEMS my $addremote=0; foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} } if ($addremote) { - - &Apache::lonhtmlcommon::clear_breadcrumb_tools(); - - &Apache::lonhtmlcommon::add_breadcrumb_tool( - 'navigation', @inlineremote[21,23]); - - my $countdown; + my ($countdown,$buttonshide); if ($env{'request.filename'} =~ /\.page$/) { my %breadcrumb_tools = &Apache::lonhtmlcommon::current_breadcrumb_tools(); if (ref($breadcrumb_tools{'tools'}) eq 'ARRAY') { - $countdown = $breadcrumb_tools{'tools'}[0]; + $countdown = $breadcrumb_tools{'tools'}->[0]; } + $buttonshide = $pagebuttonshide; } else { $countdown = &countdown_timer(); + $buttonshide = &hidden_button_check(); } - if (&hidden_button_check() eq 'yes') { + + &Apache::lonhtmlcommon::clear_breadcrumb_tools(); + + &Apache::lonhtmlcommon::add_breadcrumb_tool( + 'navigation', @inlineremote[21,23]); + + if ($buttonshide eq 'yes') { if ($countdown) { &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown); } @@ -1399,9 +1403,9 @@ sub get_editbutton { my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg) = @_; my $jscall; if (($forceview) && ($env{'form.todocs'})) { - my ($folderpath,$command); + my ($folderpath,$command,$navmap); if ($env{'request.symb'}) { - $folderpath = &Apache::loncommon::symb_to_docspath($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'; @@ -1409,11 +1413,16 @@ sub get_editbutton { $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'})); + &escape($env{'form.suppurl'}),$env{'form.todocs'}, + $suppanchor); } if ($jscall) { my $icon = 'pcstr.png'; @@ -1492,9 +1501,13 @@ sub prepare_functions { # This applies in course context # if (($perms{'mdc'}) && - (($resurl eq "/public/$cdom/$cnum/syllabus") || - ($resurl =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/}))) { - $cfile = $resurl; + (($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; @@ -1585,9 +1598,13 @@ sub prepare_functions { ($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'", + "location.href='/adm/coursedocs?command=direct&forcesupplement=1&supppath=$esc_path&anchor=$suppanchor'", 'Folder/Page Content','','',1); } } @@ -2081,6 +2098,217 @@ function toggleCountdown() { 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'}
+';
+ }
+ return < $lt{'preamble'} $lt{$type} $lt{'miss'} $lt{'okdone'} $lt{'cancel'}