version 1.596, 2020/02/12 16:25:47
|
version 1.604, 2022/02/21 18:04:35
|
Line 978 sub storeparm_by_symb_inner {
|
Line 978 sub storeparm_by_symb_inner {
|
# @param {string} $type - the parameter type |
# @param {string} $type - the parameter type |
# @param {boolean} $editable - Set to true to get an icon when no value is defined. |
# @param {boolean} $editable - Set to true to get an icon when no value is defined. |
sub valout { |
sub valout { |
my ($value,$type,$name,$editable)=@_; |
my ($value,$type,$editable)=@_; |
my $result = ''; |
my $result = ''; |
# Values of zero are valid. |
# Values of zero are valid. |
if (! $value && $value ne '0') { |
if (! $value && $value ne '0') { |
Line 1241 function validateParms() {
|
Line 1241 function validateParms() {
|
var tailLenient = /\.lenient$/; |
var tailLenient = /\.lenient$/; |
var patternRelWeight = /^\-?[\d.]+$/; |
var patternRelWeight = /^\-?[\d.]+$/; |
var patternLenientStd = /^(yes|no|default)$/; |
var patternLenientStd = /^(yes|no|default)$/; |
|
var ipRegExp = /^setip/; |
var ipallowRegExp = /^setipallow_/; |
var ipallowRegExp = /^setipallow_/; |
var ipdenyRegExp = /^setipdeny_/; |
var ipdenyRegExp = /^setipdeny_/; |
var deeplinkRegExp = /^deeplink_(listing|scope)_/; |
var deeplinkRegExp = /^deeplink_/; |
var deeplinkUrlsRegExp = /^deeplink_urls_/; |
var dlListScopeRegExp = /^deeplink_(state|others|listing|scope)_/; |
var deeplinkltiRegExp = /^deeplink_lti_/; |
var dlLinkProtectRegExp = /^deeplink_protect_/; |
var deeplinkkeyRegExp = /^deeplink_key_/; |
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\-]+/; |
var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/; |
if ((document.parmform.elements.length != 'undefined') && (document.parmform.elements.length) != 'null') { |
if ((document.parmform.elements.length != 'undefined') && (document.parmform.elements.length) != 'null') { |
if (document.parmform.elements.length) { |
if (document.parmform.elements.length) { |
Line 1275 function validateParms() {
|
Line 1280 function validateParms() {
|
} |
} |
} |
} |
} |
} |
} else if (ipallowRegExp.test(name)) { |
} else if (ipRegExp.test(name)) { |
var identifier = name.replace(ipallowRegExp,''); |
if (ipallowRegExp.test(name)) { |
var possallow = document.parmform.elements[i].value; |
var identifier = name.replace(ipallowRegExp,''); |
possallow = possallow.replace(/^\s+|\s+$/g,''); |
var possallow = document.parmform.elements[i].value; |
if (patternIP.test(possallow)) { |
possallow = possallow.replace(/^\s+|\s+$/g,''); |
if (document.parmform.elements['set_'+identifier].value) { |
if (patternIP.test(possallow)) { |
possallow = ','+possallow; |
if (document.parmform.elements['set_'+identifier].value) { |
} |
possallow = ','+possallow; |
document.parmform.elements['set_'+identifier].value += possallow; |
} |
} |
document.parmform.elements['set_'+identifier].value += possallow; |
} else if (ipdenyRegExp.test(name)) { |
} |
var identifier = name.replace(ipdenyRegExp,''); |
} else if (ipdenyRegExp.test(name)) { |
var possdeny = document.parmform.elements[i].value; |
var identifier = name.replace(ipdenyRegExp,''); |
possdeny = possdeny.replace(/^\s+|\s+$/g,''); |
var possdeny = document.parmform.elements[i].value; |
if (patternIP.test(possdeny)) { |
possdeny = possdeny.replace(/^\s+|\s+$/g,''); |
possdeny = '!'+possdeny; |
if (patternIP.test(possdeny)) { |
if (document.parmform.elements['set_'+identifier].value) { |
possdeny = '!'+possdeny; |
possdeny = ','+possdeny; |
if (document.parmform.elements['set_'+identifier].value) { |
|
possdeny = ','+possdeny; |
|
} |
|
document.parmform.elements['set_'+identifier].value += possdeny; |
} |
} |
document.parmform.elements['set_'+identifier].value += possdeny; |
|
} |
} |
} else if (deeplinkRegExp.test(name)) { |
} else if (deeplinkRegExp.test(name)) { |
var identifier = name.replace(deeplinkRegExp,''); |
if (dlListScopeRegExp.test(name)) { |
var possdeeplink = document.parmform.elements[i].value; |
var identifier = name.replace(dlListScopeRegExp,''); |
possdeeplink = possdeeplink.replace(/^\s+|\s+$/g,''); |
var idx = document.parmform.elements[i].selectedIndex; |
if (document.parmform.elements['set_'+identifier].value) { |
if (idx > 0) { |
possdeeplink = ','+possdeeplink; |
var possdeeplink = document.parmform.elements[i].options[idx].value |
} |
possdeeplink = possdeeplink.replace(/^\s+|\s+$/g,''); |
document.parmform.elements['set_'+identifier].value += possdeeplink; |
if (document.parmform.elements['set_'+identifier].value) { |
} else if (deeplinkUrlsRegExp.test(name)) { |
possdeeplink = ','+possdeeplink; |
if (document.parmform.elements[i].checked) { |
} |
var identifier = name.replace(deeplinkUrlsRegExp,''); |
document.parmform.elements['set_'+identifier].value += possdeeplink; |
var posslinkurl = document.parmform.elements[i].value; |
} |
posslinkurl = posslinkurl.replace(/^\s+|\s+$/g,''); |
} else if (dlLinkProtectRegExp.test(name)) { |
if (document.parmform.elements['set_'+identifier].value) { |
if (document.parmform.elements[i].checked) { |
posslinkurl = ','+posslinkurl; |
var identifier = name.replace(dlLinkProtectRegExp,''); |
} |
var posslinkurl = document.parmform.elements[i].value; |
document.parmform.elements['set_'+identifier].value += posslinkurl; |
posslinkurl = posslinkurl.replace(/^\s+|\s+$/g,''); |
} |
if (document.parmform.elements['set_'+identifier].value) { |
} else if (deeplinkltiRegExp.test(name)) { |
posslinkurl = ','+posslinkurl; |
var identifier = name.replace(deeplinkltiRegExp,''); |
} |
var posslti = document.parmform.elements[i].value; |
document.parmform.elements['set_'+identifier].value += posslinkurl; |
posslti = posslti.replace(/\D+/g,''); |
} |
if (document.parmform.elements['set_'+identifier].value) { |
} else if (dlLtidRegExp.test(name)) { |
posslti = ':'+posslti; |
var identifier = name.replace(dlLtidRegExp,''); |
} |
if (isRadioSet('deeplink_protect_'+identifier,'ltid')) { |
document.parmform.elements['set_'+identifier].value += posslti; |
var possltid = document.parmform.elements[i].value; |
} else if (deeplinkkeyRegExp.test(name)) { |
possltid = possltid.replace(/\D+/g,''); |
var identifier = name.replace(deeplinkkeyRegExp,''); |
if (possltid.length) { |
var posskey = document.parmform.elements[i].value; |
if (document.parmform.elements['set_'+identifier].value) { |
posskey = posskey.replace(/\W+/g,''); |
possltid = ':'+possltid; |
if (document.parmform.elements['set_'+identifier].value) { |
} |
posslti = ':'+posskey; |
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; |
|
} |
} |
} |
document.parmform.elements['set_'+identifier].value += posskey; |
|
} |
} |
} |
} |
} |
} |
Line 1337 function validateParms() {
|
Line 1414 function validateParms() {
|
return true; |
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<radioLength; j++) { |
|
if (menuitems[j].checked) { |
|
if (menuitems[j].value == expected) { |
|
result = true; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
return result; |
|
} |
|
|
ENDSCRIPT |
ENDSCRIPT |
} |
} |
|
|
Line 1401 function toggleDeepLink(form,item,key) {
|
Line 1495 function toggleDeepLink(form,item,key) {
|
if (document.getElementById('deeplink_key_'+item+'_'+key)) { |
if (document.getElementById('deeplink_key_'+item+'_'+key)) { |
keybox = document.getElementById('deeplink_key_'+item+'_'+key); |
keybox = document.getElementById('deeplink_key_'+item+'_'+key); |
} |
} |
var ltidiv; |
var divoptions = new Array(); |
if (document.getElementById('deeplinkdiv_lti_'+item+'_'+key)) { |
if (item == 'protect') { |
ltidiv = document.getElementById('deeplinkdiv_lti_'+item+'_'+key); |
divoptions = ['ltic','ltid']; |
|
} else { |
|
if (item == 'menus') { |
|
divoptions = ['colls']; |
|
} |
|
} |
|
var seldivs = new Array(); |
|
if ((item == 'protect') || (item == 'menus')) { |
|
for (var i=0; i<divoptions.length; i++) { |
|
if (document.getElementById('deeplinkdiv_'+divoptions[i]+'_'+item+'_'+key)) { |
|
seldivs[i] = document.getElementById('deeplinkdiv_'+divoptions[i]+'_'+item+'_'+key); |
|
} else { |
|
seldivs[i] = ''; |
|
} |
|
} |
} |
} |
for (var i=0; i<radios.length; i++) { |
for (var i=0; i<radios.length; i++) { |
if (radios[i].checked) { |
if (radios[i].checked) { |
if (radios[i].value == 'lti') { |
if ((item == 'protect') || (item == 'menus')) { |
ltidiv.style.display = 'inline-block'; |
for (var j=0; j<seldivs.length; j++) { |
keybox.type = 'hidden'; |
if (radios[i].value == divoptions[j]) { |
keybox.value = ''; |
if (seldivs[j] != '') { |
} else { |
seldivs[j].style.display = 'inline-block'; |
if (ltidiv != '') { |
} |
ltidiv.style.display = 'none'; |
if (item == 'protect') { |
form['deeplink_lti_'+key].selectedIndex = 0; |
keybox.type = 'hidden'; |
|
keybox.value = ''; |
|
} |
|
} else { |
|
if (seldivs[j] != '') { |
|
seldivs[j].style.display = 'none'; |
|
form['deeplink_'+divoptions[j]+'_'+key].selectedIndex = 0; |
|
} |
|
} |
} |
} |
if (radios[i].value == 'key') { |
if (item == 'protect') { |
keybox.type = 'text'; |
if (radios[i].value == 'key') { |
} else { |
keybox.type = 'text'; |
keybox.type = 'hidden'; |
} else { |
|
keybox.type = 'hidden'; |
|
} |
} |
} |
} |
} |
} |
} |
Line 1615 sub print_row {
|
Line 1733 sub print_row {
|
$effparm_rec = 1; |
$effparm_rec = 1; |
} |
} |
if ($parmname eq 'deeplink') { |
if ($parmname eq 'deeplink') { |
my %posslti; |
my ($domltistr,$crsltistr); |
my %lti = |
my %lti = |
&Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'}, |
&Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'}, |
'provider'); |
'linkprot'); |
foreach my $item (keys(%lti)) { |
if (keys(%lti)) { |
if (ref($lti{$item}) eq 'HASH') { |
foreach my $item (sort { $a <=> $b } (keys(%lti))) { |
unless ($lti{$item}{'requser'}) { |
if (($item =~ /^\d+$/) && (ref($lti{$item}) eq 'HASH')) { |
$posslti{$item} = $lti{$item}{'consumer'}; |
$domltistr .= $item.':'.&escape(&escape($lti{$item}{'name'})).','; |
} |
} |
} |
} |
|
$domltistr =~ s/,$//; |
|
if ($domltistr) { |
|
$extra = 'ltid_'.$domltistr; |
|
} |
} |
} |
if (keys(%posslti)) { |
my %courselti = &Apache::lonnet::get_course_lti($cnum,$cdom); |
$extra = 'lti_'; |
if (keys(%courselti)) { |
foreach my $lti (sort { $a <=> $b } keys(%posslti)) { |
foreach my $item (sort { $a <=> $b } keys(%courselti)) { |
$extra .= $lti.':'.&js_escape($posslti{$lti}).','; |
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); |
} |
} |
$extra =~ s/,$//; |
|
} |
} |
} |
} |
if ($parmlev eq 'general') { |
if ($parmlev eq 'general') { |
Line 1766 sub print_row {
|
Line 1911 sub print_row {
|
# @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters |
# @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters |
# @param {boolean} $readonly -true if editing not allowed. |
# @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 {strring} $extra - extra informatio to pass to plink. |
# @param {string} $extra - extra information to pass to plink. |
sub print_td { |
sub print_td { |
my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display, |
my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display, |
$noeditgrp,$readonly,$ismaplevel,$extra)=@_; |
$noeditgrp,$readonly,$ismaplevel,$extra)=@_; |
Line 1808 sub print_td {
|
Line 1953 sub print_td {
|
$nolink = 1; |
$nolink = 1; |
} |
} |
} elsif ($mprefix =~ /availablestudent\&$/) { |
} elsif ($mprefix =~ /availablestudent\&$/) { |
if ($which > 4) { |
$nolink = 1; |
$nolink = 1; |
|
} |
|
} elsif ($mprefix =~ /examcode\&$/) { |
} elsif ($mprefix =~ /examcode\&$/) { |
unless ($which == 2) { |
unless ($which == 2) { |
$nolink = 1; |
$nolink = 1; |
Line 1944 sub extractResourceInformation {
|
Line 2087 sub extractResourceInformation {
|
my $uris=shift; |
my $uris=shift; |
my $keyorder=shift; |
my $keyorder=shift; |
my $defkeytype=shift; |
my $defkeytype=shift; |
|
my $pssymb=shift; |
|
|
my $keyordercnt=100; |
my $keyordercnt=100; |
|
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
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) { |
foreach my $resource (@allres) { |
my $id=$resource->id(); |
my $id=$resource->id(); |
my ($mapid,$resid)=split(/\./,$id); |
my ($mapid,$resid)=split(/\./,$id); |
Line 2072 sub isdateparm {
|
Line 2226 sub isdateparm {
|
|
|
sub is_specialstring { |
sub is_specialstring { |
my $type=shift; |
my $type=shift; |
return (($type=~/^string_/) && (($type ne 'string_yesno'))); |
return (($type=~/^string_/) && ($type ne 'string_yesno')); |
} |
} |
|
|
# Prints the HTML and Javascript to select parameters, with various shortcuts. |
# Prints the HTML and Javascript to select parameters, with various shortcuts. |
Line 2517 function group_or_section(caller) {
|
Line 2671 function group_or_section(caller) {
|
} |
} |
|
|
if (%grouphash) { |
if (%grouphash) { |
$groups=&mt('Group:').' <select name="cgroup"'; |
$groups=&mt('Group').': <select name="cgroup"'; |
if (%sectionhash && $env{'form.action'} eq 'settable' && $currsec eq '') { |
if (%sectionhash && $env{'form.action'} eq 'settable' && $currsec eq '') { |
$groups .= qq| onchange="group_or_section('cgroup')" |; |
$groups .= qq| onchange="group_or_section('cgroup')" |; |
} |
} |
Line 3221 sub assessparms {
|
Line 3375 sub assessparms {
|
# --------------------------------------------------------- Get all assessments |
# --------------------------------------------------------- Get all assessments |
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, |
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, |
\%mapp, \%symbp,\%maptitles,\%uris, |
\%mapp, \%symbp,\%maptitles,\%uris, |
\%keyorder); |
\%keyorder,undef,$pssymb); |
|
|
%allmaps_inverted = reverse(%allmaps); |
%allmaps_inverted = reverse(%allmaps); |
|
|
Line 4576 sub listdata {
|
Line 4730 sub listdata {
|
($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/); |
($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/); |
my $section=&mt('All Students'); |
my $section=&mt('All Students'); |
$readonly = $readonlyall; |
$readonly = $readonlyall; |
|
my $userscope; |
my $showval = $$resourcedata{$thiskey}; |
my $showval = $$resourcedata{$thiskey}; |
if ($middle=~/^\[(.*)\]/) { |
if ($middle=~/^\[(.*)\]/) { |
my $issection=$1; |
my $issection=$1; |
Line 4589 sub listdata {
|
Line 4744 sub listdata {
|
} |
} |
} |
} |
$section=&mt('User').": ".&Apache::loncommon::plainname($stuname,$studom); |
$section=&mt('User').": ".&Apache::loncommon::plainname($stuname,$studom); |
|
$userscope = 1; |
} else { |
} else { |
if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) { |
if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) { |
if (exists($grouphash{$issection})) { |
if (exists($grouphash{$issection})) { |
Line 4686 sub listdata {
|
Line 4842 sub listdata {
|
'<td><b>'.&mt($parmitem). |
'<td><b>'.&mt($parmitem). |
'</b></td>'); |
'</b></td>'); |
unless ($readonly) { |
unless ($readonly) { |
|
my $disabled; |
|
if (($name eq 'availablestudent') && |
|
(($showval eq '') || ($userscope))) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
$r->print('<td><input type="checkbox" name="del_'. |
$r->print('<td><input type="checkbox" name="del_'. |
$thiskey.'" /></td>'); |
$thiskey.'"'.$disabled.' /></td>'); |
} |
} |
$r->print('<td>'); |
$r->print('<td>'); |
$foundkeys++; |
$foundkeys++; |
Line 4715 sub listdata {
|
Line 4876 sub listdata {
|
$r->print(&date_interval_selector($thiskey,$name, |
$r->print(&date_interval_selector($thiskey,$name, |
$showval,$readonly)); |
$showval,$readonly)); |
} elsif ($thistype =~ m/^string/) { |
} elsif ($thistype =~ m/^string/) { |
|
if ($name eq 'availablestudent') { |
|
$readonly = 1; |
|
} |
$r->print(&string_selector($thistype,$thiskey, |
$r->print(&string_selector($thistype,$thiskey, |
$showval,$name,$readonly)); |
$showval,$name,$readonly)); |
} else { |
} else { |
Line 4869 sub string_ip_selector {
|
Line 5033 sub string_ip_selector {
|
|
|
sub string_deeplink_selector { |
sub string_deeplink_selector { |
my ($thiskey, $showval, $readonly) = @_; |
my ($thiskey, $showval, $readonly) = @_; |
my (@components,%values,@current,%titles,%options,%optiontext,%defaults,%posslti); |
my (@components,%values,@current,%titles,%options,%optiontext,%defaults, |
@components = ('listing','scope','urls'); |
%selectnull,%domlti,%crslti,@possmenus); |
|
@components = ('state','others','listing','scope','protect','menus'); |
%titles = &Apache::lonlocal::texthash ( |
%titles = &Apache::lonlocal::texthash ( |
|
state => 'Access status', |
|
others => 'Hide other resources', |
listing => 'In Contents and/or Gradebook', |
listing => 'In Contents and/or Gradebook', |
scope => 'Access scope for link', |
scope => 'Access scope for link', |
urls => 'Supported link types', |
protect => 'Link protection', |
|
menus => 'Menu Items Displayed', |
); |
); |
%options = ( |
%options = ( |
|
state => ['only','off','both'], |
|
others => ['hide','unhide'], |
listing => ['full','absent','grades','details','datestatus'], |
listing => ['full','absent','grades','details','datestatus'], |
scope => ['res','map','rec'], |
scope => ['res','map','rec'], |
urls => ['any','only','key','lti'], |
protect => ['none','key','ltid','ltic'], |
|
menus => ['std','colls'], |
); |
); |
%optiontext = &Apache::lonlocal::texthash ( |
%optiontext = &Apache::lonlocal::texthash ( |
|
only => 'deep only', |
|
off => 'deeplink off', |
|
both => 'regular + deep', |
|
hide => 'Hidden', |
|
unhide => 'Unhidden', |
full => 'Listed (linked) in both', |
full => 'Listed (linked) in both', |
absent => 'Not listed', |
absent => 'Not listed', |
grades => 'Listed in grades only', |
grades => 'Listed in grades only', |
Line 4890 sub string_deeplink_selector {
|
Line 5066 sub string_deeplink_selector {
|
res => 'resource only', |
res => 'resource only', |
map => 'enclosing map/folder', |
map => 'enclosing map/folder', |
rec => 'recursive map/folder', |
rec => 'recursive map/folder', |
any => 'regular + deep', |
none => 'not in use', |
only => 'deep only', |
key => 'key access', |
key => 'deep with key', |
ltic => 'LTI access (course)', |
lti => 'deep with LTI launch', |
ltid => 'LTI access (domain)' , |
|
std => 'Standard (all menus)', |
|
colls => 'Numbered collection', |
|
); |
|
%selectnull = &Apache::lonlocal::texthash ( |
|
ltic => 'Select Launcher', |
|
ltid => 'Select Launcher', |
|
colls => 'Select', |
); |
); |
if ($showval =~ /,/) { |
if ($showval =~ /,/) { |
|
%values=(); |
@current = split(/,/,$showval); |
@current = split(/,/,$showval); |
($values{'listing'}) = ($current[0] =~ /^(full|absent|grades|details|datestatus)$/); |
($values{'state'}) = ($current[0] =~ /^(only|off|both)$/); |
($values{'scope'}) = ($current[1] =~ /^(res|map|rec)$/); |
($values{'others'}) = ($current[1] =~ /^(hide|unhide)$/); |
($values{'urls'}) = ($current[2] =~ /^(any|only|key:\w+|lti:\d+)$/); |
($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+)$/); |
} else { |
} else { |
|
$defaults{'state'} = 'off', |
|
$defaults{'others'} = 'unhide', |
$defaults{'listing'} = 'full'; |
$defaults{'listing'} = 'full'; |
$defaults{'scope'} = 'res'; |
$defaults{'scope'} = 'res'; |
$defaults{'urls'} = 'any'; |
$defaults{'protect'} = 'none'; |
|
$defaults{'menus'} = '0'; |
} |
} |
my $disabled; |
my $disabled; |
if ($readonly) { |
if ($readonly) { |
$disabled=' disabled="disabled"'; |
$disabled=' disabled="disabled"'; |
} |
} |
my %lti = |
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'}, |
&Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'}, |
'provider'); |
'linkprot'); |
foreach my $item (keys(%lti)) { |
foreach my $item (keys(%lti)) { |
if (ref($lti{$item}) eq 'HASH') { |
if (($item =~ /^\d+$/) && (ref($lti{$item}) eq 'HASH')) { |
unless ($lti{$item}{'requser'}) { |
$domlti{$item} = $lti{$item}{'name'}; |
$posslti{$item} = $lti{$item}{'consumer'}; |
} |
|
} |
|
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 = '<input type="hidden" name="set_'.$thiskey.'" /><table><tr>'; |
my $output = '<input type="hidden" name="set_'.$thiskey.'" /><table><tr>'; |
foreach my $item ('listing','scope','urls') { |
foreach my $item (@components) { |
$output .= '<th>'.$titles{$item}.'</th>'; |
$output .= '<th>'.$titles{$item}.'</th>'; |
} |
} |
$output .= '</tr><tr>'; |
$output .= '</tr><tr>'; |
foreach my $item (@components) { |
foreach my $item (@components) { |
$output .= '<td>'; |
$output .= '<td>'; |
if ($item eq 'urls') { |
if (($item eq 'protect') || ($item eq 'menus')) { |
my $selected = $values{$item}; |
my $selected = $values{$item}; |
foreach my $option (@{$options{$item}}) { |
foreach my $option (@{$options{$item}}) { |
if ($option eq 'lti') { |
if ($item eq 'protect') { |
next unless (keys(%posslti)); |
if ($option eq 'ltid') { |
|
next unless (keys(%domlti)); |
|
} elsif ($option eq 'ltic') { |
|
next unless (keys(%crslti)); |
|
} |
|
} elsif (($item eq 'menus') && ($option eq 'colls')) { |
|
next unless (@possmenus); |
} |
} |
my $checked; |
my $checked; |
if ($selected =~ /^\Q$option\E/) { |
if ($item eq 'menus') { |
|
if (($selected =~ /^\d+$/) && (@possmenus) && |
|
(grep(/^\Q$selected\E$/,@possmenus))) { |
|
if ($option eq 'colls') { |
|
$checked = ' checked="checked"'; |
|
} |
|
} elsif (($option eq 'std') && ($selected == 0) && ($selected ne '')) { |
|
$checked = ' checked="checked"'; |
|
} |
|
} elsif ($selected =~ /^\Q$option\E/) { |
$checked = ' checked="checked"'; |
$checked = ' checked="checked"'; |
} |
} |
my $onclick; |
my $onclick; |
Line 4944 sub string_deeplink_selector {
|
Line 5164 sub string_deeplink_selector {
|
$output .= '<span class="LC_nobreak"><label>'. |
$output .= '<span class="LC_nobreak"><label>'. |
'<input type="radio" name="deeplink_'.$item.'_'.$thiskey.'" value="'.$option.'"'.$onclick.$disabled.$checked.' />'."\n". |
'<input type="radio" name="deeplink_'.$item.'_'.$thiskey.'" value="'.$option.'"'.$onclick.$disabled.$checked.' />'."\n". |
$optiontext{$option}.'</label>'; |
$optiontext{$option}.'</label>'; |
if ($option eq 'key') { |
if (($item eq 'protect') && ($option eq 'key')) { |
my $visibility="hidden"; |
my $visibility="hidden"; |
my $currkey; |
my $currkey; |
if ($checked) { |
if ($checked) { |
Line 4952 sub string_deeplink_selector {
|
Line 5172 sub string_deeplink_selector {
|
$currkey = (split(/\:/,$values{$item}))[1]; |
$currkey = (split(/\:/,$values{$item}))[1]; |
} |
} |
$output .= ' '. |
$output .= ' '. |
'<input type="'.$visibility.'" name="deeplink_'.$option.'_'.$thiskey.'" id="deeplink_'.$option.'_'.$item.'_'.$thiskey.'" value="'.$currkey.'" size="6"'.$disabled.' />'; |
'<input type="'.$visibility.'" name="deeplink_'.$option.'_'.$thiskey.'" id="deeplink_'.$option.'_'.$item.'_'.$thiskey.'" value="'.$currkey.'" size="10"'.$disabled.' />'; |
} elsif ($option eq 'lti') { |
} elsif (($option eq 'ltic') || ($option eq 'ltid') || ($option eq 'colls')) { |
my $display="none"; |
my $display="none"; |
my ($currlti,$blankcheck); |
my ($current,$blankcheck,@possibles); |
if ($checked) { |
if ($checked) { |
$display = 'inline-block'; |
$display = 'inline-block'; |
$currlti = (split(/\:/,$values{$item}))[1]; |
if (($option eq 'ltic') || ($option eq 'ltid')) { |
|
$current = (split(/\:/,$selected))[1]; |
|
} else { |
|
$current = $selected; |
|
} |
} else { |
} else { |
$blankcheck = ' selected="selected"'; |
$blankcheck = ' selected="selected"'; |
} |
} |
|
if ($option eq 'ltid') { |
|
@possibles = keys(%domlti); |
|
} elsif ($option eq 'ltic') { |
|
@possibles = keys(%crslti); |
|
} else { |
|
@possibles = @possmenus; |
|
} |
$output .= '<div id="deeplinkdiv_'.$option.'_'.$item.'_'.$thiskey.'"'. |
$output .= '<div id="deeplinkdiv_'.$option.'_'.$item.'_'.$thiskey.'"'. |
' style="display: '.$display.'"> <select name="'. |
' style="display: '.$display.'"> <select name="'. |
'deeplink_'.$option.'_'.$thiskey.'"'.$disabled.'>'. |
'deeplink_'.$option.'_'.$thiskey.'"'.$disabled.'>'; |
'<option value=""'.$blankcheck.'>'.&mt('Select Provider').'</option>'."\n"; |
if (@possibles > 1) { |
foreach my $lti (sort { $a <=> $b } keys(%posslti)) { |
$output .= '<option value=""'.$blankcheck.'>'.$selectnull{$option}. |
|
'</option>'."\n"; |
|
} |
|
foreach my $poss (sort { $a <=> $b } @possibles) { |
my $selected; |
my $selected; |
if ($lti == $currlti) { |
if (($poss == $current) || (scalar(@possibles) ==1)) { |
$selected = ' selected="selected"'; |
$selected = ' selected="selected"'; |
} |
} |
$output .= '<option value="'.$lti.'"'.$selected.'>'.$posslti{$lti}.'</option>'; |
my $shown = $poss; |
|
if ($option eq 'ltid') { |
|
$shown = $domlti{$poss}; |
|
} elsif ($option eq 'ltic') { |
|
$shown = $crslti{$poss}; |
|
} |
|
$output .= '<option value="'.$poss.'"'.$selected.'>'.$shown.'</option>'; |
} |
} |
$output .= '</select></div>'; |
$output .= '</select></div>'; |
} |
} |
Line 5035 my %strings =
|
Line 5275 my %strings =
|
=> [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'], |
=> [['_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' |
'string_deeplink' |
=> [['on','Set choices for link protection, resource listing, and access scope']], |
=> [['on','Set choices for link protection, resource listing, access scope, and shown menu items']], |
); |
); |
|
|
|
|
Line 5046 my %stringmatches = (
|
Line 5286 my %stringmatches = (
|
=> [['_allowfrom_','[^\!]+'], |
=> [['_allowfrom_','[^\!]+'], |
['_denyfrom_','\!']], |
['_denyfrom_','\!']], |
'string_deeplink' |
'string_deeplink' |
=> [['on','^(full|absent|grades|details|datestatus)\,(res|map|rec)\,(any|only|key\:\w+|lti\:\d+)$']], |
=> [['on','^(only|off|both)\,(hide|unhide)\,(full|absent|grades|details|datestatus)\,(res|map|rec)\,(none|key\:\w+|ltic\:\d+|ltid\:\d+)\,(\d+|)$']], |
); |
); |
|
|
my %stringtypes = ( |
my %stringtypes = ( |
Line 5653 ENDOVER
|
Line 5893 ENDOVER
|
|
|
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, |
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, |
\%mapp, \%symbp,\%maptitles,\%uris, |
\%mapp, \%symbp,\%maptitles,\%uris, |
\%keyorder,\%defkeytype); |
\%keyorder,\%defkeytype,$pssymb); |
|
|
if (grep {$_ eq 'all'} (@psprt)) { |
if (grep {$_ eq 'all'} (@psprt)) { |
@psprt = keys(%allparts); |
@psprt = keys(%allparts); |