--- loncom/interface/lonparmset.pm 2022/04/30 03:11:05 1.609
+++ loncom/interface/lonparmset.pm 2022/07/03 04:31:07 1.615
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.609 2022/04/30 03:11:05 raeburn Exp $
+# $Id: lonparmset.pm,v 1.615 2022/07/03 04:31:07 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1252,6 +1252,7 @@ function validateParms() {
var dlKeyRegExp = /^deeplink_key_/;
var dlMenusRegExp = /^deeplink_menus_/;
var dlCollsRegExp = /^deeplink_colls_/;
+ var dlTargetRegExp = /^deeplink_target_/;
var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;
if ((document.parmform.elements.length != 'undefined') && (document.parmform.elements.length) != 'null') {
if (document.parmform.elements.length) {
@@ -1406,6 +1407,17 @@ function validateParms() {
}
document.parmform.elements['set_'+identifier].value += posslinkmenu;
}
+ } else if (dlTargetRegExp.test(name)) {
+ var identifier = name.replace(dlTargetRegExp,'');
+ var idx = document.parmform.elements[i].selectedIndex;
+ if (idx > 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;
+ }
}
}
}
@@ -1461,6 +1473,8 @@ END
# Javascript function toggleSecret, for overview mode.
sub done_proctor_js {
+ my $defaultdone = &mt('Done');
+ &js_escape(\$defaultdone);
return <<"END";
function toggleSecret(form,radio,key) {
var radios = form[radio+key];
@@ -1477,6 +1491,15 @@ function toggleSecret(form,radio,key) {
document.getElementById('done_'+key+'_proctorkey').value='';
}
}
+ if (document.getElementById('done_'+key+'_buttontext')) {
+ if (radios[i].value == '') {
+ document.getElementById('done_'+key+'_buttontext').value = '';
+ } else {
+ if (document.getElementById('done_'+key+'_buttontext').value == '') {
+ document.getElementById('done_'+key+'_buttontext').value = '$defaultdone';
+ }
+ }
+ }
}
}
}
@@ -2743,8 +2766,9 @@ sub displaymenu {
# @param {string} $pschp - selected map pc, or 'all'
# @param {hash reference} $maptitles - hash map id or src -> 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=[];
@@ -2792,7 +2816,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 =
@@ -3650,7 +3678,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);
@@ -4874,7 +4902,7 @@ sub listdata {
}
if ($is_map) {
my $leveltitle = &mt('Folder/Map');
- my $title = &Apache::lonnet::gettitle($1);
+ my $title = &Apache::lonnet::gettitle($mapurl);
if (ref($hash_for_realm) eq 'HASH') {
if ($hash_for_realm->{$mapurl} eq '1') {
$title = &mt('Main Content');
@@ -5021,13 +5049,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$/) &&
@@ -5046,6 +5078,7 @@ sub get_date_interval_from_form {
$seconds .= '_'.$env{'form.done_'.$key.'_proctorkey'};
}
}
+ return if (!$numnotnull);
return $seconds;
}
@@ -5135,7 +5168,7 @@ sub string_deeplink_selector {
my ($thiskey, $showval, $readonly) = @_;
my (@components,%values,@current,%titles,%options,%optiontext,%defaults,
%selectnull,%domlti,%crslti,@possmenus);
- @components = ('state','others','listing','scope','protect','menus');
+ @components = ('state','others','listing','scope','protect','menus','target');
%titles = &Apache::lonlocal::texthash (
state => 'Access status',
others => 'Hide other resources',
@@ -5143,6 +5176,7 @@ sub string_deeplink_selector {
scope => 'Access scope for link',
protect => 'Link protection',
menus => 'Menu Items Displayed',
+ target => 'Embedded?',
);
%options = (
state => ['only','off','both'],
@@ -5151,6 +5185,7 @@ sub string_deeplink_selector {
scope => ['res','map','rec'],
protect => ['none','key','ltid','ltic'],
menus => ['std','colls'],
+ target => ['_self','_top'],
);
%optiontext = &Apache::lonlocal::texthash (
only => 'deep only',
@@ -5172,6 +5207,8 @@ sub string_deeplink_selector {
ltid => 'LTI access (domain)' ,
std => 'Standard (all menus)',
colls => 'Numbered collection',
+ _self => 'Embedded',
+ _top => 'Not embedded',
);
%selectnull = &Apache::lonlocal::texthash (
ltic => 'Select Launcher',
@@ -5187,6 +5224,7 @@ sub string_deeplink_selector {
($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)$/);
} else {
$defaults{'state'} = 'off',
$defaults{'others'} = 'unhide',
@@ -5194,6 +5232,7 @@ sub string_deeplink_selector {
$defaults{'scope'} = 'res';
$defaults{'protect'} = 'none';
$defaults{'menus'} = '0';
+ $defaults{'target'} = '_top';
}
my $disabled;
if ($readonly) {
@@ -5375,7 +5414,7 @@ my %strings =
=> [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],
['_denyfrom_','Hostname(s) or IP(s) from which access is disallowed']],
'string_deeplink'
- => [['on','Set choices for link protection, resource listing, access scope, and shown menu items']],
+ => [['on','Set choices for link protection, resource listing, access scope, shown menu items, and embedding']],
);
@@ -5386,7 +5425,7 @@ my %stringmatches = (
=> [['_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+|)$']],
+ => [['on','^(only|off|both)\,(hide|unhide)\,(full|absent|grades|details|datestatus)\,(res|map|rec)\,(none|key\:\w+|ltic\:\d+|ltid\:\d+)\,(\d+|)\,_(self|top)$']],
);
my %stringtypes = (
@@ -5706,6 +5745,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);
@@ -5713,29 +5757,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;
@@ -5752,7 +5796,8 @@ sub date_interval_selector {
'&').'"'.$disabled.' />
'.
''.&mt('Button text').': '.
- '&').'"'.$disabled.' />';
+ '&').'"'.$disabled.' />';
}
}
unless ($readonly) {
@@ -6005,10 +6050,8 @@ ENDOVER
$r->print('