--- loncom/interface/lonmenu.pm 2016/10/26 15:12:46 1.369.2.60
+++ loncom/interface/lonmenu.pm 2020/04/07 18:34:26 1.369.2.71.2.2
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.369.2.60 2016/10/26 15:12:46 raeburn Exp $
+# $Id: lonmenu.pm,v 1.369.2.71.2.2 2020/04/07 18:34:26 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) || ($canvgr)) {
+ unless ($canmgr || $canvgr) {
my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom);
if (keys(%slots) > 0) {
$showresv = 1;
@@ -445,11 +446,11 @@ 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;
@@ -497,7 +498,7 @@ sub secondary_menu {
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'}=~
@@ -963,7 +965,7 @@ if ($env{'browser.mobile'}) {
$is_mobile = 1;
}
- unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {
+ 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/})) {
$menuitems.=(<[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;
@@ -1579,15 +1592,20 @@ sub prepare_functions {
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'",
+ "location.href='/adm/coursedocs?command=direct&forcesupplement=1&supppath=$esc_path&anchor=$suppanchor'",
'Folder/Page Content','','',1);
}
}
@@ -2081,6 +2099,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.').'