0)) {
if ($result eq '') {
$recurse_check = 1;
@@ -1535,25 +1815,72 @@ sub print_row {
($result == 16 || $result == 10 || $result == 6 || $result == 2)) {
$effparm_rec = 1;
}
+ if ($parmname eq 'deeplink') {
+ my ($domltistr,$crsltistr);
+ my %lti =
+ &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'},
+ 'linkprot');
+ if (keys(%lti)) {
+ foreach my $item (sort { $a <=> $b } (keys(%lti))) {
+ if (($item =~ /^\d+$/) && (ref($lti{$item}) eq 'HASH')) {
+ $domltistr .= $item.':'.&escape(&escape($lti{$item}{'name'})).',';
+ }
+ }
+ $domltistr =~ s/,$//;
+ if ($domltistr) {
+ $extra = 'ltid_'.$domltistr;
+ }
+ }
+ my %courselti = &Apache::lonnet::get_course_lti($cnum,$cdom);
+ if (keys(%courselti)) {
+ foreach my $item (sort { $a <=> $b } keys(%courselti)) {
+ if (($item =~ /^\d+$/) && (ref($courselti{$item}) eq 'HASH')) {
+ $crsltistr .= $item.':'.&escape(&escape($courselti{$item}{'name'})).',';
+ }
+ }
+ $crsltistr =~ s/,$//;
+ if ($crsltistr) {
+ if ($extra) {
+ $extra .= '&';
+ }
+ $extra .= 'ltic_'.$crsltistr;
+ }
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.menucollections'}) {
+ my @colls;
+ foreach my $item (split(/;/,$env{'course.'.$env{'request.course.id'}.'.menucollections'})) {
+ my ($num,$value) = split(/\%/,$item);
+ if ($num =~ /^\d+$/) {
+ push(@colls,$num);
+ }
+ }
+ if (@colls) {
+ if ($extra) {
+ $extra .= '&';
+ }
+ $extra .= 'menus_'.join(',',@colls);
+ }
+ }
+ }
if ($parmlev eq 'general') {
if ($uname) {
- &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
} elsif ($cgroup) {
- &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,'',$extra);
} elsif ($csec) {
- &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
} else {
- &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
}
} elsif ($parmlev eq 'map') {
if ($uname) {
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1,$extra);
} elsif ($cgroup) {
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1,$extra);
} elsif ($csec) {
- &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
+ &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1,$extra);
} else {
- &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
+ &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1,$extra);
}
} else {
if ($uname) {
@@ -1576,31 +1903,31 @@ sub print_row {
}
}
- &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
- &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
- &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
- &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,18,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
+ &print_td($r,16,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1,$extra);
+ &print_td($r,15,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
+ &print_td($r,14,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
if ($csec) {
- &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
- &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,12,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
+ &print_td($r,10,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1,$extra);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
}
if ($cgroup) {
- &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly);
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1);
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp.$readonly);
+ &print_td($r,8,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,'',$extra);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp,$readonly,1,$extra);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp.$readonly,'',$extra);
}
if ($uname) {
if ($othergrp) {
$r->print($othergrp);
}
- &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
- &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,4,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1,$extra);
+ &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,'',$extra);
}
} # end of $parmlev if/else
if (ref($recursinfo) eq 'ARRAY') {
@@ -1616,13 +1943,13 @@ sub print_row {
}
}
my ($parmname)=($thismarker=~/\_([^\_]+)$/);
- $effective_parm = &valout($recursinfo->[0],$recursinfo->[1],$parmname);
+ $effective_parm = &valout($recursinfo->[0],$recursinfo->[1]);
$r->print(''.$effective_parm.
''.$rectitle.' '.
$effparm_level.' ');
} else {
if ($result) {
- $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$parmname);
+ $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);
}
if ($eff_groupparm) {
$effective_parm = $eff_groupparm;
@@ -1639,7 +1966,7 @@ sub print_row {
$sessionvaltype=$$defaulttype{$which};
}
$r->print(''.
- &valout($sessionval,$sessionvaltype,$$name{$which}).' '.
+ &valout($sessionval,$sessionvaltype).' '.
' ');
}
$r->print('');
@@ -1666,10 +1993,11 @@ sub print_row {
# @param {hash reference} $display - parameter key -> full title for the parameter
# @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters
# @param {boolean} $readonly -true if editing not allowed.
-# @param {boolean} $ismaplevel - true if level is for a map.
+# @param {boolean} $ismaplevel - true if level is for a map.
+# @param {string} $extra - extra information to pass to plink.
sub print_td {
my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,
- $noeditgrp,$readonly,$ismaplevel)=@_;
+ $noeditgrp,$readonly,$ismaplevel,$extra)=@_;
my ($ineffect,$recursive,$currval,$currtype,$currlevel);
$ineffect = 0;
$currval = $$outpar[$which];
@@ -1708,9 +2036,7 @@ sub print_td {
$nolink = 1;
}
} elsif ($mprefix =~ /availablestudent\&$/) {
- if ($which > 4) {
- $nolink = 1;
- }
+ $nolink = 1;
} elsif ($mprefix =~ /examcode\&$/) {
unless ($which == 2) {
$nolink = 1;
@@ -1719,11 +2045,12 @@ sub print_td {
}
if ($nolink) {
my ($parmname)=((split(/\&/,$mprefix))[1]=~/\_([^\_]+)$/);
- $r->print(&valout($currval,$currtype,$parmname));
+ $r->print(&valout($currval,$currtype));
} else {
$r->print(&plink($currtype,
$$display{$value},$currval,
- $mprefix.$currlevel,'parmform.pres','psub',$recursive));
+ $mprefix.$currlevel,'parmform.pres','psub',$recursive,
+ $extra));
}
$r->print(''."\n");
}
@@ -1758,7 +2085,7 @@ sub check_other_groups {
if ($result > 3) {
$bgcolor = '#AAFFAA';
}
- $grp_parm = &valout($coursereply,$resulttype,$parmname);
+ $grp_parm = &valout($coursereply,$resulttype);
$output = '';
if ($resultgroup && $resultlevel) {
if ($resultlevel eq 'recursive') {
@@ -1830,6 +2157,7 @@ sub parm_control_group {
# @param {hash reference} $uris - hash resource/map id -> resource src
# @param {hash reference} $keyorder - hash parameter key -> appearance rank for this parameter when looking through every resource and every parameter, starting at 100 (integer)
# @param {hash reference} $defkeytype - hash parameter name -> parameter type
+# @param {string} $pssymb - resource symb (when a single resource is selected)
sub extractResourceInformation {
my $ids = shift;
my $typep = shift;
@@ -1843,11 +2171,22 @@ sub extractResourceInformation {
my $uris=shift;
my $keyorder=shift;
my $defkeytype=shift;
+ my $pssymb=shift;
my $keyordercnt=100;
my $navmap = Apache::lonnavmaps::navmap->new();
- my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
+ return unless(ref($navmap));
+ my @allres;
+ if ($pssymb ne '') {
+ my $res = $navmap->getBySymb($pssymb);
+ if (ref($res)) {
+ @allres = ($res);
+ }
+ }
+ if (!@allres) {
+ @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
+ }
foreach my $resource (@allres) {
my $id=$resource->id();
my ($mapid,$resid)=split(/\./,$id);
@@ -1966,6 +2305,14 @@ sub isdateparm {
return (($type=~/^date/) && (!($type eq 'date_interval')));
}
+# Determine if parameter type is specialized string type (i.e.,
+# not just string or string_yesno.
+
+sub is_specialstring {
+ my $type=shift;
+ return (($type=~/^string_/) && ($type ne 'string_yesno'));
+}
+
# Prints the HTML and Javascript to select parameters, with various shortcuts.
#
# @param {Apache2::RequestRec} $r - the Apache request
@@ -2101,6 +2448,7 @@ sub lookUpTableParameter {
'buttonshide' => 'hiding',
'turnoffeditor' => 'hiding',
'encrypturl' => 'hiding',
+ 'deeplink' => 'hiding',
'randomorder' => 'high_level_randomization',
'randompick' => 'high_level_randomization',
'available' => 'slots',
@@ -2218,8 +2566,9 @@ sub parmboxes {
if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
$r->print( ' checked="checked"');
}
- $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
- : $tempkey)
+ $r->print(' />'.($$allparms{$tempkey}=~/\S/ ?
+ Text::Wrap::wrap('',' 'x4,$$allparms{$tempkey})
+ : $tempkey)
.' '."\n");
}
$r->print('');
@@ -2310,9 +2659,37 @@ sub partmenu {
sub usermenu {
my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups,$pssymb)=@_;
my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
- &Apache::loncommon::selectstudent_link('parmform','uname','udom');
- my $selscript=&Apache::loncommon::studentbrowser_javascript();
+ &Apache::loncommon::selectstudent_link('parmform','uname','udom','condition').
+ &Apache::lonhtmlcommon::scripttag(< '.
+ $stuonly.' '.
+ ' '.
+ &mt('any role').' ';
my $sections='';
my %sectionhash = &Apache::loncommon::get_sections();
@@ -2379,7 +2756,7 @@ function group_or_section(caller) {
}
if (%grouphash) {
- $groups=&mt('Group:').' map title
# @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb
+# @param {string} $parmlev - parameter level (Resource:'full', Map:'map', Course:'general')
sub mapmenu {
- my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;
+ my ($r,$allmaps,$pschp,$maptitles,$symbp,$parmlev)=@_;
my %allmaps_inverted = reverse %$allmaps;
my $navmap = Apache::lonnavmaps::navmap->new();
my $tree=[];
@@ -2499,7 +2877,11 @@ sub mapmenu {
}
}
# Show it ...
- $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',' id="mapmenu"'));
+ my $rowattr = ' id="mapmenu"';
+ if ($parmlev eq 'general') {
+ $rowattr .= ' style="display:none"';
+ }
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',$rowattr));
if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {
my $icon = ' ';
my $whitespace =
@@ -2741,19 +3123,33 @@ sub keysindisplayorder {
#
# @param {Apache2::RequestRec} $r - the Apache request
# @param {string} $sortorder - realmstudent|studentrealm
+# @param {string} $context - newoverview|overview
sub sortmenu {
- my ($r,$sortorder)=@_;
- $r->print(' print(' checked="checked"');
+ my ($r,$sortorder,$context)=@_;
+ my %text;
+ if ($context eq 'newoverview') {
+ %text = &Apache::lonlocal::texthash (
+ realmstudent => 'Sort by location in course first, then student (group/section)',
+ studentrealm => 'Sort by student (group/section) first, then location in course',
+ );
+ } else {
+ %text = &Apache::lonlocal::texthash (
+ realmstudent => 'Sort by realm first, then student (group/section)',
+ studentrealm => 'Sort by student (group/section) first, then realm',
+ );
}
- $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
- $r->print(' ' checked="checked"',
+ studentrealm => '',
+ );
if ($sortorder eq 'studentrealm') {
- $r->print(' checked="checked"');
+ $sortchecked{'studentrealm'} = $sortchecked{'realmstudent'};
+ $sortchecked{'realmstudent'} = '';
+ }
+ foreach my $sorttype ('realmstudent','studentrealm') {
+ $r->print(' '.
+ $text{$sorttype}.' ');
}
- $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
- ' ');
}
# Returns a hash parameter key -> order (integer) giving the order for some parameters.
@@ -2954,27 +3350,124 @@ sub assessparms {
$csec=&Apache::lonnet::getsection($udom,$uname,
$env{'request.course.id'});
if ($csec eq '-1') {
- $message=
- ''.
- &mt('User [_1] at domain [_2] not in this course',
- "'".$uname."'","'".$udom."'").
- '
';
- $uname='';
- $csec=$env{'form.csec'};
+ my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
+ if ($env{'form.userroles'} eq 'any') {
+ if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {
+ $csec = $env{'request.course.sec'};
+ $message = '';
+ if ($crstype eq 'Community') {
+ $message .= &mt('User [_1] at domain [_2] has a non-member role in this community',
+ $uname,$udom);
+ } else {
+ $message .= &mt('User [_1] at domain [_2] has a non-student role in this course',
+ $uname,$udom);
+ }
+ $message .= ' ';
+ } else {
+ my @possroles = ('in','ep','ta','cr');
+ if ($crstype eq 'Community') {
+ unshift(@possroles,'co');
+ } else {
+ unshift(@possroles,'cc');
+ }
+ my %not_student_roles =
+ &Apache::lonnet::get_my_roles($uname,$udom,'userroles',['active'],
+ \@possroles,[$udom],1,1);
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my %sections_by_role;
+ foreach my $role (keys(%not_student_roles)) {
+ if ($role =~ /^\Q$cnum:$cdom:\E([^:]+):(|[^:]+)$/) {
+ my ($rolename,$sec) = ($1,$2);
+ if ($rolename =~ m{^cr/}) {
+ $rolename = 'cr';
+ }
+ push(@{$sections_by_role{$rolename}},$sec);
+ }
+ }
+ my $numroles = scalar(keys(%sections_by_role));
+ if ($numroles) {
+ foreach my $role (@possroles) {
+ if (ref($sections_by_role{$role}) eq 'ARRAY') {
+ my @secs = sort { $a <=> $b } @{$sections_by_role{$role}};
+ $csec = $secs[0];
+ last;
+ }
+ }
+ }
+ if ($csec eq '-1') {
+ $message = '';
+ if ($crstype eq 'Community') {
+ $message .= &mt('User [_1] at domain [_2] does not have a role in this community',
+ $uname,$udom);
+ } else {
+ $message .= &mt('User [_1] at domain [_2] does not have a role in this course',
+ $uname,$udom);
+ }
+ $message .= ' ';
+ $uname='';
+ if ($env{'request.course.sec'} ne '') {
+ $csec=$env{'request.course.sec'};
+ } else {
+ $csec=$env{'form.csec'};
+ }
+ $cgroup=$env{'form.cgroup'};
+ } else {
+ $message = '';
+ if ($crstype eq 'Community') {
+ $message .= &mt('User [_1] at domain [_2] has a non-member role in this community',
+ $uname,$udom);
+ } else {
+ $message .= &mt('User [_1] at domain [_2] has a non-student role in this course',
+ $uname,$udom);
+ }
+ $message .= ' ';
+ }
+ }
+ } else {
+ $message = '';
+ if ($crstype eq 'Community') {
+ $message .= &mt('User [_1] at domain [_2] does not have a member role in this community',
+ $uname,$udom);
+ } else {
+ $message .= &mt('User [_1] at domain [_2] does not have a student role in this course',
+ $uname,$udom);
+ }
+ $message .= ' ';
+ $uname='';
+ if ($env{'request.course.sec'} ne '') {
+ $csec=$env{'request.course.sec'};
+ } else {
+ $csec=$env{'form.csec'};
+ }
+ $cgroup=$env{'form.cgroup'};
+ }
+ } elsif ($env{'request.course.sec'} ne '') {
+ if ($csec ne $env{'request.course.sec'}) {
+ $message=''.
+ &mt("User '[_1]' at domain '[_2]' not in section '[_3]'",
+ $uname,$udom,$env{'request.course.sec'}).
+ ' ';
+ $uname='';
+ $csec=$env{'request.course.sec'};
+ }
$cgroup=$env{'form.cgroup'};
- } else {
+ }
+ if ($uname ne '') {
my %name=&Apache::lonnet::userenvironment($udom,$uname,
('firstname','middlename','lastname','generation','id'));
- $message="\n\n".&mt("Full Name").": ".
- $name{'firstname'}.' '.$name{'middlename'}.' '
- .$name{'lastname'}.' '.$name{'generation'}.
- " \n".&mt('Student/Employee ID').": ".$name{'id'}.'
';
- }
- @usersgroups = &Apache::lonnet::get_users_groups(
- $udom,$uname,$env{'request.course.id'});
- if (@usersgroups > 0) {
- unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
- $cgroup = $usersgroups[0];
+ $message .= "\n
\n".&mt('Full Name').': '
+ .$name{'firstname'}.' '.$name{'middlename'}.' '
+ .$name{'lastname'}.' '.$name{'generation'}
+ ." \n".&mt('Student/Employee ID').': '.$name{'id'}.'
';
+ @usersgroups = &Apache::lonnet::get_users_groups(
+ $udom,$uname,$env{'request.course.id'});
+ if (@usersgroups > 0) {
+ unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
+ $cgroup = $usersgroups[0];
+ }
+ } else {
+ $cgroup = '';
}
}
}
@@ -2986,7 +3479,7 @@ sub assessparms {
# --------------------------------------------------------- Get all assessments
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
\%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder);
+ \%keyorder,undef,$pssymb);
%allmaps_inverted = reverse(%allmaps);
@@ -3003,6 +3496,7 @@ sub assessparms {
my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
my ($got_chostname,$chostname,$cmajor,$cminor);
my $totalstored = 0;
+ my $totalskippeduser = 0;
my $now = time;
for (my $i=0;$i<=$#markers;$i++) {
my ($needsrelease,$needsnewer,$name,$namematch);
@@ -3011,6 +3505,11 @@ sub assessparms {
}
if ($markers[$i] =~ /\&(8|7|6|5)$/) {
next if ($noeditgrp);
+ } elsif ($markers[$i] =~ /\&(4|3|2|1)$/) {
+ if ($uname eq '') {
+ $totalskippeduser ++;
+ next;
+ }
}
if ($markers[$i] =~ /\&(17|11|7|3)$/) {
$namematch = 'maplevelrecurse';
@@ -3149,9 +3648,27 @@ sub assessparms {
# ---------------------------------------------------------------- Done storing
if ($totalstored) {
$message.=''
+ .&mt('Changes for [quant,_1,parameter] saved.',$totalstored)
+ .' '
.&mt('Changes can take up to 10 minutes before being active for all students.')
.&Apache::loncommon::help_open_topic('Caching')
.'
';
+ } else {
+ $message.=''.&mt('No parameter changes saved.').'
';
+ }
+ if ($totalskippeduser) {
+ $message .= '';
+ if ($uhome eq 'no_host') {
+ $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the username or ID was invalid.',
+ $totalskippeduser);
+ } elsif ($env{'form.userroles'} eq 'any') {
+ $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user does not have a course role.',
+ $totalskippeduser);
+ } else {
+ $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user is not a student.',
+ $totalskippeduser);
+ }
+ $message .= '
';
}
}
@@ -3171,7 +3688,10 @@ sub assessparms {
&startpage($r,$pssymb,$crstype);
foreach my $item ('tolerance','date_default','date_start','date_end',
- 'date_interval','int','float','string') {
+ 'date_interval','int','float','string','string_lenient',
+ 'string_examcode','string_deeplink','string_discussvote',
+ 'string_useslots','string_problemstatus','string_ip',
+ 'string_questiontype') {
$r->print(' ').
'" name="recent_'.$item.'" />');
@@ -3179,13 +3699,20 @@ sub assessparms {
# ----- Start Parameter Selection
- # Hide parm selection?
+ # Hide parm selection and possibly table?
+ my ($tablejs,$tabledivsty);
+ if (((($env{'form.uname'} ne '') || ($env{'form.id'} ne '')) && ($uname eq '')) &&
+ ($env{'form.dis'}) && ($pssymb eq '')) {
+ $tablejs = 'document.getElementById('."'parmtable'".').style.display = "";';
+ $tabledivsty = ' style="display:none"';
+ }
$r->print(<
//
@@ -3212,7 +3739,7 @@ ENDPARMSELSCRIPT
$r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
&levelmenu($r,\%alllevs,$parmlev);
$r->print(&Apache::lonhtmlcommon::row_closure());
- &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);
+ &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
$r->print(&Apache::lonhtmlcommon::row_closure());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
&partmenu($r,\%allparts,\@psprt);
@@ -3292,6 +3819,7 @@ ENDPARMSELSCRIPT
if ($parm_permission->{'edit'}) {
undef($readonly);
}
+ $r->print('');
if ($parmlev eq 'full') {
#
@@ -3508,7 +4036,7 @@ ENDTABLEHEADFOUR
#-------------------------------------------- for each map, gather information
my $mapid;
- foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys(%maplist)) {
+ foreach $mapid (sort { $a <=> $b } keys(%maplist)) {
my $maptitle = $maplist{$mapid};
#----------------------- loop through ids and get all parameter types for map
@@ -3725,6 +4253,7 @@ ENDMAPONE
.''
);
} # end of $parmlev eq general
+ $r->print('
');
}
$r->print('');
if ($numreclinks) {
@@ -3831,7 +4360,7 @@ sub readdata {
# Stores parameter data, using form parameters directly.
#
# Uses the following form parameters. The variable part in the names is a resourcedata key (except for a modification for user data).
-# set_* (except settext, setipallow, setipdeny) - set a parameter value
+# set_* (except settext, setipallow, setipdeny, setdeeplink) - set a parameter value
# del_* - remove a parameter
# datepointer_* - set a date parameter (value is key_* refering to a set of other form parameters)
# dateinterval_* - set a date interval parameter (value refers to more form parameters)
@@ -3864,7 +4393,7 @@ sub storedata {
my $cmd=$1;
my $thiskey=$2;
my ($altkey,$recursive,$tkey,$tkeyrec,$tkeynonrec);
- next if ($cmd eq 'rec' || $cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny');
+ next if ($cmd eq 'rec' || $cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny' || $cmd eq 'setdeeplink');
if ((($cmd eq 'set') || ($cmd eq 'datepointer') || ($cmd eq 'dateinterval') || ($cmd eq 'del')) &&
($thiskey =~ /(?:sequence|page)\Q___(all)\E/)) {
unless ($thiskey =~ /(encrypturl|hiddenresource)$/) {
@@ -3895,8 +4424,8 @@ sub storedata {
$text = &mt('Saved modified parameter for');
if ($typeof eq 'string_questiontype') {
$name = 'type';
- } elsif ($typeof eq 'string_lenient') {
- $name = 'lenient';
+ } elsif (($typeof eq 'string_lenient') || ($typeof eq 'string_deeplink')) {
+ ($name) = ($typeof =~ /^string_(lenient|deeplink)$/);
my $stringmatch = &standard_string_matches($typeof);
if (ref($stringmatch) eq 'ARRAY') {
foreach my $item (@{$stringmatch}) {
@@ -4262,9 +4791,12 @@ sub parse_listdata_key {
# @param {string} $caller - name of the calling sub (overview|newoverview)
# @param {hash reference} $classlist - from loncoursedata::get_classlist
# @param {boolean} $readonly - true if editing not allowed
+# @param {string} $parmlev - full|map
+# @param {hash reference} $hash_for_realm - keys: realm, values: numeric order
+# @param {string} $pschp - selected map pc, or 'all'
# @returns{integer} - number of $listdata parameters processed
sub listdata {
- my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;
+ my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly,$parmlev,$hash_for_realm,$pschp)=@_;
# Start list output
@@ -4275,6 +4807,7 @@ sub listdata {
$tableopen=0;
my $foundkeys=0;
my %keyorder=&standardkeyorder();
+ my $readonlyall = $readonly;
my ($secidx,%grouphash);
if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
@@ -4289,6 +4822,20 @@ sub listdata {
foreach my $key (sort {
my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
+ my ($aid,$bid);
+ if ($caller eq 'newoverview') {
+ if (ref($hash_for_realm) eq 'HASH') {
+ if (($parmlev eq 'map') && ($pschp eq 'all')) {
+ my ($aurl) = ($ares =~ /^(.+\.(?:sequence|page))___\(all\)$/);
+ my ($burl) = ($bres =~ /^(.+\.(?:sequence|page))___\(all\)$/);
+ $aid = $hash_for_realm->{$aurl};
+ $bid = $hash_for_realm->{$burl};
+ } elsif ($parmlev eq 'full') {
+ $aid = $hash_for_realm->{$ares};
+ $bid = $hash_for_realm->{$bres};
+ }
+ }
+ }
# get the numerical order for the param
$aparm=$keyorder{'parameter_0_'.$aparm};
@@ -4298,7 +4845,21 @@ sub listdata {
if ($sortorder eq 'realmstudent') {
if ($ares ne $bres ) {
- $result = ($ares cmp $bres);
+ if ($caller eq 'newoverview') {
+ if (ref($hash_for_realm) eq 'HASH') {
+ if (($parmlev eq 'map') && ($pschp eq 'all')) {
+ $result = ($aid <=> $bid);
+ } elsif ($parmlev eq 'full') {
+ $result = ($aid <=> $bid);
+ } else {
+ $result = ($ares cmp $bres);
+ }
+ } else {
+ $result = ($ares cmp $bres);
+ }
+ } else {
+ $result = ($ares cmp $bres);
+ }
} elsif ($astudent ne $bstudent) {
$result = ($astudent cmp $bstudent);
} elsif ($apart ne $bpart ) {
@@ -4308,7 +4869,21 @@ sub listdata {
if ($astudent ne $bstudent) {
$result = ($astudent cmp $bstudent);
} elsif ($ares ne $bres ) {
- $result = ($ares cmp $bres);
+ if ($caller eq 'newoverview') {
+ if (ref($hash_for_realm) eq 'HASH') {
+ if (($parmlev eq 'map') && ($pschp eq 'all')) {
+ $result = ($aid <=> $bid);
+ } elsif ($parmlev eq 'full') {
+ $result = ($aid <=> $bid);
+ } else {
+ $result = ($ares cmp $bres);
+ }
+ } else {
+ $result = ($ares cmp $bres);
+ }
+ } else {
+ $result = ($ares cmp $bres);
+ }
} elsif ($apart ne $bpart ) {
$result = ($apart cmp $bpart);
}
@@ -4336,6 +4911,8 @@ sub listdata {
my ($middle,$part,$name)=
($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/);
my $section=&mt('All Students');
+ $readonly = $readonlyall;
+ my $userscope;
my $showval = $$resourcedata{$thiskey};
if ($middle=~/^\[(.*)\]/) {
my $issection=$1;
@@ -4349,6 +4926,7 @@ sub listdata {
}
}
$section=&mt('User').": ".&Apache::loncommon::plainname($stuname,$studom);
+ $userscope = 1;
} else {
if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
if (exists($grouphash{$issection})) {
@@ -4385,6 +4963,12 @@ sub listdata {
}
if ($is_map) {
my $leveltitle = &mt('Folder/Map');
+ my $title = &Apache::lonnet::gettitle($mapurl);
+ if (ref($hash_for_realm) eq 'HASH') {
+ if ($hash_for_realm->{$mapurl} eq '1') {
+ $title = &mt('Main Content');
+ }
+ }
unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) {
if ($caller eq 'newoverview') {
my $altkey = $thiskey;
@@ -4401,9 +4985,10 @@ sub listdata {
$is_recursive = 1;
}
}
- $realm=''.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' ('.$mapurl.') ';
+ $realm=''.$leveltitle.': '.$title.' ('.$mapurl.') ';
} elsif ($middle) {
my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
+ next if (($url =~ /\.(page|sequence)$/) && ($parmlev eq 'full') && ($caller eq 'newoverview'));
$realm=''.&mt('Resource').
': '.&Apache::lonnet::gettitle($middle).
' ('.$url.' in '.$map.' id: '.
@@ -4446,8 +5031,13 @@ sub listdata {
' '.&mt($parmitem).
' ');
unless ($readonly) {
+ my $disabled;
+ if (($name eq 'availablestudent') &&
+ (($showval eq '') || ($userscope))) {
+ $disabled = ' disabled="disabled"';
+ }
$r->print(' ');
+ $thiskey.'"'.$disabled.' /> ');
}
$r->print('');
$foundkeys++;
@@ -4475,6 +5065,9 @@ sub listdata {
$r->print(&date_interval_selector($thiskey,$name,
$showval,$readonly));
} elsif ($thistype =~ m/^string/) {
+ if ($name eq 'availablestudent') {
+ $readonly = 1;
+ }
$r->print(&string_selector($thistype,$thiskey,
$showval,$name,$readonly));
} else {
@@ -4517,13 +5110,17 @@ sub listdata {
sub get_date_interval_from_form {
my ($key) = @_;
my $seconds = 0;
+ my $numnotnull = 0;
foreach my $which (['days', 86400],
['hours', 3600],
['minutes', 60],
['seconds', 1]) {
my ($name, $factor) = @{ $which };
if (defined($env{'form.'.$name.'_'.$key})) {
- $seconds += $env{'form.'.$name.'_'.$key} * $factor;
+ unless ($env{'form.'.$name.'_'.$key} eq '') {
+ $numnotnull ++;
+ $seconds += $env{'form.'.$name.'_'.$key} * $factor;
+ }
}
}
if (($key =~ /\.interval$/) &&
@@ -4542,6 +5139,7 @@ sub get_date_interval_from_form {
$seconds .= '_'.$env{'form.done_'.$key.'_proctorkey'};
}
}
+ return if (!$numnotnull);
return $seconds;
}
@@ -4627,6 +5225,257 @@ sub string_ip_selector {
return $output;
}
+sub string_deeplink_selector {
+ my ($thiskey, $showval, $readonly) = @_;
+ my (@tables,%values,@current,%titles,%options,%optiontext,%defaults,
+ %selectnull,%domlti,%crslti,@possmenus,%components);
+ @tables = ('upper','lower');
+ %components = (
+ upper => ['state','others','listing','scope'],
+ lower => ['protect','menus','target','exit'],
+ );
+ %titles = &Apache::lonlocal::texthash (
+ state => 'Access status',
+ others => 'Hide other resources',
+ listing => 'In Contents and/or Gradebook',
+ scope => 'Access scope for link',
+ protect => 'Link protection',
+ menus => 'Menu Items Displayed',
+ target => 'Embedded?',
+ exit => 'Exit Tool Button?',
+ );
+ %options = (
+ state => ['only','off','both'],
+ others => ['hide','unhide'],
+ listing => ['full','absent','grades','details','datestatus'],
+ scope => ['res','map','rec'],
+ protect => ['none','key','ltid','ltic'],
+ menus => ['std','colls'],
+ target => ['_self','_top'],
+ exit => ['no','yes','url'],
+ );
+ %optiontext = &Apache::lonlocal::texthash (
+ only => 'deep only',
+ off => 'deeplink off',
+ both => 'regular + deep',
+ hide => 'Hidden',
+ unhide => 'Unhidden',
+ full => 'Listed (linked) in both',
+ absent => 'Not listed',
+ grades => 'Listed in grades only',
+ details => 'Listed (unlinked) in both',
+ datestatus => 'Listed (unlinked) inc. status in both',
+ res => 'resource only',
+ map => 'enclosing map/folder',
+ rec => 'recursive map/folder',
+ none => 'not in use',
+ key => 'key access',
+ ltic => 'LTI access (course)',
+ ltid => 'LTI access (domain)' ,
+ std => 'Standard (all menus)',
+ colls => 'Numbered collection',
+ _self => 'Embedded',
+ _top => 'Not embedded',
+ no => 'Not in use',
+ yes => 'In use, no URL redirect',
+ url => 'In use, redirect to URL',
+ );
+ %selectnull = &Apache::lonlocal::texthash (
+ ltic => 'Select Launcher',
+ ltid => 'Select Launcher',
+ colls => 'Select',
+ );
+ if ($showval =~ /,/) {
+ %values=();
+ @current = split(/,/,$showval);
+ ($values{'state'}) = ($current[0] =~ /^(only|off|both)$/);
+ ($values{'others'}) = ($current[1] =~ /^(hide|unhide)$/);
+ ($values{'listing'}) = ($current[2] =~ /^(full|absent|grades|details|datestatus)$/);
+ ($values{'scope'}) = ($current[3] =~ /^(res|map|rec)$/);
+ ($values{'protect'}) = ($current[4] =~ /^(key:[a-zA-Z\d_.!\@#\$%^&*()+=-]+|ltic:\d+|ltid:\d+)$/);
+ ($values{'menus'}) = ($current[5] =~ /^(\d+)$/);
+ ($values{'target'}) = ($current[6] =~ /^(_self|_top)$/);
+ ($values{'exit'}) = ($current[7] =~ /^((?:(?:yes|url)(?:|\:[^:;"',]+))|no)$/);
+ } else {
+ $defaults{'state'} = 'off',
+ $defaults{'others'} = 'unhide',
+ $defaults{'listing'} = 'full';
+ $defaults{'scope'} = 'res';
+ $defaults{'protect'} = 'none';
+ $defaults{'menus'} = '0';
+ $defaults{'target'} = '_top';
+ $defaults{'exit'} = 'yes';
+ }
+ my $disabled;
+ if ($readonly) {
+ $disabled=' disabled="disabled"';
+ }
+ my %courselti =
+ &Apache::lonnet::get_course_lti($env{'course.'.$env{'request.course.id'}.'.num'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'});
+ foreach my $item (keys(%courselti)) {
+ if (ref($courselti{$item}) eq 'HASH') {
+ $crslti{$item} = $courselti{$item}{'name'};
+ }
+ }
+ my %lti =
+ &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'},
+ 'linkprot');
+ foreach my $item (keys(%lti)) {
+ if (($item =~ /^\d+$/) && (ref($lti{$item}) eq 'HASH')) {
+ $domlti{$item} = $lti{$item}{'name'};
+ }
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.menucollections'}) {
+ foreach my $item (split(/;/,$env{'course.'.$env{'request.course.id'}.'.menucollections'})) {
+ my ($num,$value) = split(/\%/,$item);
+ if ($num =~ /^\d+$/) {
+ push(@possmenus,$num);
+ }
+ }
+ }
+
+ my $output = ' ';
+ foreach my $table ('upper','lower') {
+ next unless (ref($components{$table}) eq 'ARRAY');
+ $output .= ''."\n";
+ if ($table eq 'upper') {
+ $output .= ' ';
+ }
+ }
+ return $output;
+}
+
{ # block using some constants related to parameter types (overview mode)
@@ -4660,8 +5509,11 @@ my %strings =
['no','No']],
'string_ip'
=> [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],
- ['_denyfrom_',], 'Hostname(s) or IP(s) from which access is disallowed'],
- );
+ ['_denyfrom_','Hostname(s) or IP(s) from which access is disallowed']],
+ 'string_deeplink'
+ => [['on','Set choices for link protection, resource listing, access scope, shown menu items, embedding, and exit link']],
+ );
+
my %stringmatches = (
'string_lenient'
@@ -4669,6 +5521,8 @@ my %stringmatches = (
'string_ip'
=> [['_allowfrom_','[^\!]+'],
['_denyfrom_','\!']],
+ 'string_deeplink'
+ => [['on','^(only|off|both)\,(hide|unhide)\,(full|absent|grades|details|datestatus)\,(res|map|rec)\,(none|key\:\w+|ltic\:\d+|ltid\:\d+)\,(\d+|)\,_(self|top),(yes|url|no)(|:[^:;\'",]+)$']],
);
my %stringtypes = (
@@ -4678,6 +5532,7 @@ my %stringtypes = (
discussvote => 'string_discussvote',
examcode => 'string_examcode',
acc => 'string_ip',
+ deeplink => 'string_deeplink',
);
# Returns the possible values and titles for a given string type, or undef if there are none.
@@ -4737,6 +5592,7 @@ sub string_selector {
($thistype eq 'string_lenient') ||
($thistype eq 'string_discussvote') ||
($thistype eq 'string_ip') ||
+ ($thistype eq 'string_deeplink') ||
($name eq 'retrypartial')) {
my ($got_chostname,$chostname,$cmajor,$cminor);
foreach my $possibilities (@{ $strings{$thistype} }) {
@@ -4775,6 +5631,8 @@ sub string_selector {
if ($thistype eq 'string_ip') {
return &string_ip_selector($thiskey,$showval,$readonly);
+ } elsif ($thistype eq 'string_deeplink') {
+ return &string_deeplink_selector($thiskey,$showval,$readonly);
}
my ($result,$disabled);
@@ -4984,6 +5842,11 @@ sub date_interval_selector {
$showval %= $factor;
my %select = ((map {$_ => $_} (0..$max)),
'select_form_order' => [0..$max]);
+ if ($currval eq '') {
+ unshift(@{$select{'select_form_order'}},'');
+ $select{''} = '';
+ $amount = '';
+ }
$result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
\%select,'',$readonly);
$result .= ' '.&mt($name);
@@ -4991,29 +5854,29 @@ sub date_interval_selector {
if ($name eq 'interval') {
unless ($skipval{'done'}) {
my $checkedon = '';
+ my $checkedoff = '';
my $checkedproc = '';
my $currproctorkey = '';
my $currprocdisplay = 'hidden';
my $currdonetext = &mt('Done');
- my $checkedoff = ' checked="checked"';
if ($currval =~ /^(?:\d+)_done$/) {
$checkedon = ' checked="checked"';
- $checkedoff = '';
} elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {
$currdonetext = $1;
$checkedon = ' checked="checked"';
- $checkedoff = '';
} elsif ($currval =~ /^(?:\d+)_done_proctor_(.+)$/) {
$currproctorkey = $1;
$checkedproc = ' checked="checked"';
- $checkedoff = '';
$currprocdisplay = 'text';
} elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:_proctor_(.+)$/) {
$currdonetext = $1;
$currproctorkey = $2;
$checkedproc = ' checked="checked"';
- $checkedoff = '';
$currprocdisplay = 'text';
+ } elsif ($currval ne '') {
+ $checkedoff = ' checked="checked"';
+ } else {
+ $currdonetext = '';
}
my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
my $disabled;
@@ -5030,7 +5893,8 @@ sub date_interval_selector {
' &').'"'.$disabled.' /> '.
''.&mt('Button text').': '.
- ' &').'"'.$disabled.' /> ';
+ ' &').'"'.$disabled.' />';
}
}
unless ($readonly) {
@@ -5130,9 +5994,22 @@ sub oldversion_warning {
# @param {integer} $shift - time to shift, in seconds
# @returns {string} - error name or 'ok'
sub dateshift {
- my ($shift)=@_;
+ my ($shift,$numchanges)=@_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $sec = $env{'request.course.sec'};
+ my $secgrpregex;
+ if ($sec ne '') {
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ }
+ if (@groups) {
+ $secgrpregex = '(?:'.join('|',($sec,@groups)).')';
+ } else {
+ $secgrpregex = $sec;
+ }
+ }
my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
# ugly retro fix for broken version of types
foreach my $key (keys(%data)) {
@@ -5147,7 +6024,11 @@ sub dateshift {
# go through all parameters and look for dates
foreach my $key (keys(%data)) {
if ($data{$key.'.type'}=~/^date_(start|end)$/) {
+ if ($sec ne '') {
+ next unless ($key =~ /^$env{'request.course.id'}\.\[$secgrpregex\]\./);
+ }
my $newdate=$data{$key}+$shift;
+ $$numchanges ++;
$storecontent{$key}=$newdate;
}
}
@@ -5189,6 +6070,7 @@ sub newoverview {
&validateparms_js()."\n".
&ipacc_boxes_js()."\n".
&done_proctor_js()."\n".
+ &deeplink_js()."\n".
'// ]]>
';
@@ -5253,7 +6135,7 @@ ENDOVER
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
\%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder,\%defkeytype);
+ \%keyorder,\%defkeytype,$pssymb);
if (grep {$_ eq 'all'} (@psprt)) {
@psprt = keys(%allparts);
@@ -5265,10 +6147,8 @@ ENDOVER
$r->print('');
$r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
&levelmenu($r,\%alllevs,$parmlev);
- if ($parmlev ne 'general') {
- $r->print(&Apache::lonhtmlcommon::row_closure());
- &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp);
- }
+ $r->print(&Apache::lonhtmlcommon::row_closure());
+ &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
$r->print(&Apache::lonhtmlcommon::row_closure(1));
$r->print(&Apache::lonhtmlcommon::end_pick_box());
$r->print('
');
@@ -5306,7 +6186,7 @@ ENDOVER
$r->print('');
my $sortorder=$env{'form.sortorder'};
unless ($sortorder) { $sortorder='realmstudent'; }
- &sortmenu($r,$sortorder);
+ &sortmenu($r,$sortorder,'newoverview');
$r->print('
');
$r->print('
');
@@ -5331,7 +6211,15 @@ ENDOVER
# List data
- &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);
+ my $hash_for_realm;
+ if (($parmlev eq 'map') && (keys(%allmaps))) {
+ %{$hash_for_realm} = reverse(%allmaps);
+ } elsif (($parmlev eq 'full') && (keys(%symbp))) {
+ for (my $i=0; $i<@ids; $i++) {
+ $hash_for_realm->{$symbp{$ids[$i]}} = $i;
+ }
+ }
+ &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly,$parmlev,$hash_for_realm,$pschp);
}
$r->print(&tableend());
unless ($readonly) {
@@ -5410,6 +6298,7 @@ sub overview {
&validateparms_js()."\n".
&ipacc_boxes_js()."\n".
&done_proctor_js()."\n".
+ &deeplink_js()."\n".
'// ]]>'."\n".
''."\n";
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
@@ -5437,7 +6326,7 @@ sub overview {
my $sortorder=$env{'form.sortorder'};
unless ($sortorder) { $sortorder='realmstudent'; }
- &sortmenu($r,$sortorder);
+ &sortmenu($r,$sortorder,'overview');
my $submitbutton = ' ';
@@ -5557,9 +6446,21 @@ sub date_shift_one {
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
-
+ my $sec = $env{'request.course.sec'};
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
text=>"Shifting Dates"});
+ my $submit_text = &mt('Shift all dates accordingly');
+ if ($sec ne '') {
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ }
+ if (@groups) {
+ $submit_text = &mt("Shift dates set just for your section/group(s), accordingly");
+ } else {
+ $submit_text = &mt("Shift dates set just for your section, accordingly");
+ }
+ }
my $start_page=&Apache::loncommon::start_page('Shift Dates');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
$r->print($start_page.$breadcrumbs);
@@ -5575,7 +6476,7 @@ sub date_shift_one {
' '.
' '.
' '.
- ' ');
+ ' ');
&endSettingsScreen($r);
$r->print(&Apache::loncommon::end_page());
}
@@ -5587,6 +6488,7 @@ sub date_shift_two {
my ($r) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $sec = $env{'request.course.sec'};
my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
text=>"Shifting Dates"});
@@ -5595,14 +6497,47 @@ sub date_shift_two {
$r->print($start_page.$breadcrumbs);
&startSettingsScreen($r,'parmset',$crstype);
my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
- $r->print(''.&mt('Shift Dates').' '.
- ''.&mt('Shifting all dates such that [_1] becomes [_2]',
- &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
- &Apache::lonlocal::locallocaltime($timeshifted)).'
');
+ $r->print(''.&mt('Shift Dates').' ');
+ if ($sec ne '') {
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ }
+ if (@groups) {
+ $r->print(''.
+ &mt("Shift dates set just for your section/group(s), such that [_1] becomes [_2]",
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).
+ '
');
+ } else {
+ $r->print(''.
+ &mt("Shift dates set just for your section, such that [_1] becomes [_2]",
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).
+ '
');
+ }
+ } else {
+ $r->print(''.&mt('Shifting all dates such that [_1] becomes [_2]',
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).
+ '
');
+ }
my $delta=$timeshifted-$env{'form.timebase'};
- &dateshift($delta);
+ my $numchanges = 0;
+ my $result = &dateshift($delta,\$numchanges);
+ if ($result eq 'ok') {
+ $r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('Completed shifting of [quant,_1,date setting]',
+ $numchanges)));
+ } elsif ($result eq 'con_delayed') {
+ $r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('Queued shifting of [quant,_1,date setting]',
+ $numchanges)));
+ } else {
+ $r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('An error occurred attempting to shift dates'),1));
+ }
$r->print(
- &Apache::lonhtmlcommon::confirm_success(&mt('Done')).
' '.
&Apache::lonhtmlcommon::actionbox(
[''.&mt('Content and Problem Settings').' ']));
@@ -5975,7 +6910,7 @@ sub continue {
my $output;
$output .= '');
}
- $r->print('Or you may enter a new metadata field name.'.
+ $r->print(' '.
+ &mt('[_1]Or[_2] you may enter a new metadata field name.',
+ '',' ').
'');
}
&endSettingsScreen($r);
@@ -6058,6 +7003,11 @@ sub setrestrictmeta {
&startSettingsScreen($r,'parmset',$crstype);
my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
my $save_field = '';
+ my %lt = &Apache::lonlocal::texthash(
+ addm => 'Add Metadata Field',
+ ordm => 'Order Metadata Fields',
+ save => 'Save',
+ );
if ($env{'form.restrictmeta'}) {
foreach my $field (sort(keys(%env))) {
if ($field=~m/^form.(.+)_(.+)$/) {
@@ -6096,28 +7046,25 @@ sub setrestrictmeta {
my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
# Now get possible added metadata fields
my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
- my $row_alt = 1;
$output .= &Apache::loncommon::start_data_table();
foreach my $field (sort(keys(%metadata_fields))) {
if ($field ne 'courserestricted') {
- $row_alt = $row_alt ? 0 : 1;
- $output.= &output_row($r, $field, $metadata_fields{$field});
+ $output.= &output_row($r,$field,$metadata_fields{$field});
}
}
my $buttons = (<
+