--- loncom/interface/lonparmset.pm 2021/03/08 13:29:24 1.522.2.28.2.1
+++ loncom/interface/lonparmset.pm 2022/03/23 17:29:29 1.522.2.28.4.3
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.522.2.28.2.1 2021/03/08 13:29:24 raeburn Exp $
+# $Id: lonparmset.pm,v 1.522.2.28.4.3 2022/03/23 17:29:29 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -831,7 +831,7 @@ sub valout {
sub plink {
- my ($type,$dis,$value,$marker,$return,$call)=@_;
+ my ($type,$dis,$value,$marker,$return,$call,$extra)=@_;
my $winvalue=$value;
unless ($winvalue) {
if ((&isdateparm($type)) || (&is_specialstring($type))) {
@@ -850,13 +850,13 @@ sub plink {
my $valout = &valout($value,$type,1);
my $unencmarker = $marker;
foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
- \$hour, \$min, \$sec) {
+ \$hour, \$min, \$sec, \$extra) {
$$item = &HTML::Entities::encode($$item,'"<>&');
$$item =~ s/\'/\\\'/g;
}
return '
';
}
@@ -879,7 +879,7 @@ sub page_js {
typedef=document.parmform.pres_type.value.split('_');
if (document.parmform.pres_type.value!='') {
if ((typedef[0]=='date') ||
- (specstring.test(document.parmform.pres_type.value))) {
+ (specstring.test(document.parmform.pres_type.value))) {
eval('document.parmform.recent_'+
document.parmform.pres_type.value+
'.value=document.parmform.pres_value.value;');
@@ -933,31 +933,147 @@ sub validateparms_js {
return <<'ENDSCRIPT';
function validateParms() {
+ var textRegExp = /^settext_/;
+ var ipRegExp = /^setip/;
var ipallowRegExp = /^setipallow_/;
var ipdenyRegExp = /^setipdeny_/;
+ var deeplinkRegExp = /^deeplink_/;
+ var dlListScopeRegExp = /^deeplink_(state|others|listing|scope)_/;
+ var dlLinkProtectRegExp = /^deeplink_protect_/;
+ var dlLtidRegExp = /^deeplink_ltid_/;
+ var dlLticRegExp = /^deeplink_ltic_/;
+ var dlKeyRegExp = /^deeplink_key_/;
+ var dlMenusRegExp = /^deeplink_menus_/;
+ var dlCollsRegExp = /^deeplink_colls_/;
var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;
if ((document.parmform.elements.length != 'undefined') && (document.parmform.elements.length) != 'null') {
if (document.parmform.elements.length) {
for (i=0; i 0) {
+ var possdeeplink = document.parmform.elements[i].options[idx].value
+ possdeeplink = possdeeplink.replace(/^\s+|\s+$/g,'');
+ if (document.parmform.elements['set_'+identifier].value) {
+ possdeeplink = ','+possdeeplink;
+ }
+ document.parmform.elements['set_'+identifier].value += possdeeplink;
+ }
+ } else if (dlLinkProtectRegExp.test(name)) {
+ if (document.parmform.elements[i].checked) {
+ var identifier = name.replace(dlLinkProtectRegExp,'');
+ var posslinkurl = document.parmform.elements[i].value;
+ posslinkurl = posslinkurl.replace(/^\s+|\s+$/g,'');
+ if (document.parmform.elements['set_'+identifier].value) {
+ posslinkurl = ','+posslinkurl;
+ }
+ document.parmform.elements['set_'+identifier].value += posslinkurl;
+ }
+ } else if (dlLtidRegExp.test(name)) {
+ var identifier = name.replace(dlLtidRegExp,'');
+ if (isRadioSet('deeplink_protect_'+identifier,'ltid')) {
+ var possltid = document.parmform.elements[i].value;
+ possltid = possltid.replace(/\D+/g,'');
+ if (possltid.length) {
+ if (document.parmform.elements['set_'+identifier].value) {
+ possltid = ':'+possltid;
+ }
+ document.parmform.elements['set_'+identifier].value += possltid;
+ } else {
+ document.parmform.elements['set_'+identifier].value = '';
+ alert("A link type of 'domain LTI launch' was selected but no domain LTI launcher was selected.\nPlease select one, or choose a different supported link type.");
+ return false;
+ }
+ }
+ } else if (dlLticRegExp.test(name)) {
+ var identifier = name.replace(dlLticRegExp,'');
+ if (isRadioSet('deeplink_protect_'+identifier,'ltic')) {
+ var possltic = document.parmform.elements[i].value;
+ possltic = possltic.replace(/\D+/g,'');
+ if (possltic.length) {
+ if (document.parmform.elements['set_'+identifier].value) {
+ possltic = ':'+possltic;
+ }
+ document.parmform.elements['set_'+identifier].value += possltic;
+ } else {
+ document.parmform.elements['set_'+identifier].value = '';
+ alert("A link type of 'course LTI launch' was selected but no course LTI launcher was selected.\nPlease select one, or choose a different supported link type.");
+ return false;
+ }
+ }
+ } else if (dlKeyRegExp.test(name)) {
+ var identifier = name.replace(dlKeyRegExp,'');
+ if (isRadioSet('deeplink_protect_'+identifier,'key')) {
+ var posskey = document.parmform.elements[i].value;
+ posskey = posskey.replace(/^\s+|\s+$/g,'');
+ var origlength = posskey.length;
+ posskey = posskey.replace(/[^a-zA-Z\d_.!@#$%^&*()+=-]/g,'');
+ var newlength = posskey.length;
+ if (newlength > 0) {
+ var change = origlength - newlength;
+ if (change) {
+ alert(change+' disallowed character(s) removed from deeplink key');
+ }
+ if (document.parmform.elements['set_'+identifier].value) {
+ posskey = ':'+posskey;
+ }
+ document.parmform.elements['set_'+identifier].value += posskey;
+ } else {
+ document.parmform.elements['set_'+identifier].value = '';
+ if (newlength < origlength) {
+ alert("A link type of 'deep with key' was selected but the key value was blank, after removing disallowed characters.\nPlease enter a key using one or more of: a-zA-Z0-9_.!@#$%^&*()+=-");
+ } else {
+ alert("A link type of 'deep with key' was selected but the key value was blank.\nPlease enter a key.");
+ }
+ return false;
+ }
+ }
+ } else if (dlMenusRegExp.test(name)) {
+ if (document.parmform.elements[i].checked) {
+ var identifier = name.replace(dlMenusRegExp,'');
+ var posslinkmenu = document.parmform.elements[i].value;
+ posslinkmenu = posslinkmenu.replace(/^\s+|\s+$/g,'');
+ if (posslinkmenu == 'std') {
+ posslinkmenu = '0';
+ if (document.parmform.elements['set_'+identifier].value) {
+ posslinkmenu = ','+posslinkmenu;
+ }
+ document.parmform.elements['set_'+identifier].value += posslinkmenu;
+ }
+ }
+ } else if (dlCollsRegExp.test(name)) {
+ var identifier = name.replace(dlCollsRegExp,'');
+ if (isRadioSet('deeplink_menus_'+identifier,'colls')) {
+ var posslinkmenu = document.parmform.elements[i].value;
+ if (document.parmform.elements['set_'+identifier].value) {
+ posslinkmenu = ','+posslinkmenu;
+ }
+ document.parmform.elements['set_'+identifier].value += posslinkmenu;
}
}
}
@@ -967,6 +1083,23 @@ function validateParms() {
return true;
}
+function isRadioSet(name,expected) {
+ var menuitems = document.getElementsByName(name);
+ var radioLength = menuitems.length;
+ result = false;
+ if (radioLength > 1) {
+ for (var j=0; j $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,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
} elsif ($cgroup) {
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra);
} elsif ($csec) {
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
} else {
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
}
} elsif ($parmlev eq 'map') {
if ($uname) {
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
} elsif ($cgroup) {
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra);
} elsif ($csec) {
- &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
} else {
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
}
} else {
if ($uname) {
@@ -1152,32 +1396,32 @@ sub print_row {
}
}
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
if ($csec) {
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
}
if ($cgroup) {
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
- &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra);
+ &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly,$extra);
}
if ($uname) {
if ($othergrp) {
$r->print($othergrp);
}
- &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
+ &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly,$extra);
}
} # end of $parmlev if/else
@@ -1197,7 +1441,7 @@ sub print_row {
}
sub print_td {
- my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_;
+ my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly,$extra)=@_;
$r->print('');
my $nolink = 0;
@@ -1225,7 +1469,7 @@ sub print_td {
} else {
$r->print(&plink($$typeoutpar[$which],
$$display{$value},$$outpar[$which],
- $mprefix."$which",'parmform.pres','psub'));
+ $mprefix."$which",'parmform.pres','psub',$extra));
}
$r->print(' | '."\n");
}
@@ -1396,7 +1640,7 @@ sub isdateparm {
sub is_specialstring {
my $type=shift;
- return (($type=~/^string_/) && (($type ne 'string_yesno')));
+ return (($type=~/^string_/) && ($type ne 'string_yesno'));
}
#
@@ -1533,6 +1777,7 @@ sub lookUpTableParameter {
'buttonshide' => 'hiding',
'turnoffeditor' => 'hiding',
'encrypturl' => 'hiding',
+ 'deeplink' => 'hiding',
'randomorder' => 'high_level_randomization',
'randompick' => 'high_level_randomization',
'available' => 'slots',
@@ -1809,7 +2054,7 @@ function group_or_section(caller) {
}
if (%grouphash) {
- $groups=&mt('Group:').'