--- loncom/interface/courseprefs.pm 2025/05/13 04:07:07 1.135
+++ loncom/interface/courseprefs.pm 2025/06/14 02:50:25 1.136
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.135 2025/05/13 04:07:07 raeburn Exp $
+# $Id: courseprefs.pm,v 1.136 2025/06/14 02:50:25 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -2026,13 +2026,23 @@ sub process_ltitools {
} else {
$ltitools{$newid}{'display'}{'target'} = 'iframe';
}
- foreach my $item ('passback','roster','returnurl') {
+ foreach my $item ('desturl','returnurl','passback','roster') {
if ($env{'form.ltitools_'.$item.'_add'}) {
$ltitools{$newid}{$item} = 1;
- if ($item eq 'returnurl') {
+ if (($item eq 'returnurl') || ($item eq 'desturl')) {
if ($env{'form.ltitools_crs'.$item.'_add'}) {
$ltitools{$newid}{'crsconf'}{$item} = 1;
}
+ if ($item eq 'desturl') {
+ $env{'form.ltitools_defdest_add'} =~ s{^\s+|\s+$}{}g;
+ $env{'form.ltitools_defdelay_add'} =~ s{^\s+|\s+$}{}g;
+ if ($env{'form.ltitools_defdest_add'} ne '') {
+ $ltitools{$newid}{'defdest'} = $env{'form.ltitools_defdest_add'};
+ if ($env{'form.ltitools_defdelay_add'} =~ /^(\d+\.?\d*)$/) {
+ $ltitools{$newid}{'defdelay'} = $1;
+ }
+ }
+ }
} elsif ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
my $lifetime = $env{'form.ltitools_'.$item.'valid_add'};
$lifetime =~ s/^\s+|\s+$//g;
@@ -2217,10 +2227,10 @@ sub process_ltitools {
} else {
$haschanges{$itemid} = 1;
}
- foreach my $extra ('passback','roster','returnurl') {
+ foreach my $extra ('desturl','returnurl','passback','roster') {
if ($env{'form.ltitools_'.$extra.'_'.$i}) {
$ltitools{$itemid}{$extra} = 1;
- if ($extra eq 'returnurl') {
+ if (($extra eq 'returnurl') || ($extra eq 'desturl')) {
if ($env{'form.ltitools_crs'.$extra.'_'.$i}) {
$ltitools{$itemid}{'crsconf'}{$extra} = 1;
if (ref($values->{$itemid}{'crsconf'}) eq 'HASH') {
@@ -2231,6 +2241,26 @@ sub process_ltitools {
$haschanges{$itemid} = 1;
}
}
+ if ($extra eq 'desturl') {
+ $env{'form.ltitools_defdest_'.$i} =~ s{^\s+|\s+$}{}g;
+ $env{'form.ltitools_defdelay_'.$i} =~ s{^\s+|\s+$}{}g;
+ if ($env{'form.ltitools_defdest_'.$i} =~ m{^(https?\://|/)}) {
+ $ltitools{$itemid}{'defdest'} = $env{'form.ltitools_defdest_'.$i};
+ if ($values->{$itemid}{'defdest'} ne $ltitools{$itemid}{'defdest'}) {
+ $haschanges{$itemid} = 1;
+ }
+ } elsif ($values->{$itemid}{'defdest'} ne '') {
+ $haschanges{$itemid} = 1;
+ }
+ if ($env{'form.ltitools_defdelay_'.$i} =~ /^(\d+\.?\d*)$/) {
+ $ltitools{$itemid}{'defdelay'} = $1;
+ if ($values->{$itemid}{'defdelay'} ne $ltitools{$itemid}{'defdelay'}) {
+ $haschanges{$itemid} = 1;
+ }
+ } elsif ($values->{$itemid} =~ /^(\d+\.?\d*)$/) {
+ $haschanges{$itemid} = 1;
+ }
+ }
} elsif ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
my $lifetime = $env{'form.ltitools_'.$extra.'valid_'.$i};
$lifetime =~ s/^\s+|\s+$//g;
@@ -3356,11 +3386,14 @@ sub store_ltitools {
$output .= ' '.&mt('None');
}
$output .= '';
- foreach my $item ('passback','roster','returnurl') {
- $output .= '
'.$lt{$item}.' ';
+ foreach my $item ('desturl','returnurl','passback','roster') {
+ $output .= ''.$lt{$item};
if ($changes->{$itemid}{$item}) {
- $output .= &mt('Yes');
- if ($item eq 'returnurl') {
+ if ($item eq 'desturl') {
+ $output .= ':';
+ }
+ $output .= ' '.&mt('Yes');
+ if (($item eq 'returnurl') || ($item eq 'desturl')) {
if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') {
$output .= ' ['.&mt('Configurable in course').': ';
if ($changes->{$itemid}{'crsconf'}{$item}) {
@@ -3368,7 +3401,22 @@ sub store_ltitools {
} else {
$output .= &mt('No');
}
- $output .= ']';
+ $output .= ' ]';
+ }
+ if ($item eq 'desturl') {
+ $output .= ''.&mt('Default destination').': ';
+ if ($changes->{$itemid}{'defdest'} ne '') {
+ $output .= $changes->{$itemid}{'defdest'}.
+ ''.&mt('Default delay between login and redirect').': ';
+ if ($changes->{$itemid}{'defdelay'} ne '') {
+ $output .= $changes->{$itemid}{'defdelay'}.' s';
+ } else {
+ $output .= &mt('None set');
+ }
+ $output .= '';
+ } else {
+ $output .= &mt('None').'';
+ }
}
} elsif ($changes->{$itemid}{$item.'valid'}) {
if ($item eq 'passback') {
@@ -3379,10 +3427,12 @@ sub store_ltitools {
$changes->{$itemid}{$item.'valid'});
}
}
+ unless ($item eq 'desturl') {
+ $output .= '';
+ }
} else {
- $output .= &mt('No');
+ $output .= ' '.&mt('No').'';
}
- $output .= '';
}
if (ref($changes->{$itemid}{'display'}) eq 'HASH') {
my $displaylist;
@@ -6664,22 +6714,27 @@ sub print_ltitools {
%courseconfig = %{$settings->{$item}->{'crsconf'}};
}
}
- foreach my $extra ('passback','roster','returnurl') {
+ foreach my $extra ('desturl','returnurl','passback','roster') {
my $validsty = 'none';
my $currvalid;
my $checkedon = '';
my $checkedoff = ' checked="checked"';
my $crscheckedon = '';
my $crscheckedoff = ' checked="checked"';
+ my ($defdest,$defdelay);
if ($settings->{$item}->{$extra}) {
$checkedon = $checkedoff;
$checkedoff = '';
$validsty = 'inline-block';
- if ($extra eq 'returnurl') {
+ if (($extra eq 'returnurl') || ($extra eq 'desturl')) {
if ($courseconfig{$extra}) {
$crscheckedon = ' checked="checked"';
$crscheckedoff = '';
}
+ if ($extra eq 'desturl') {
+ $defdest = $settings->{$item}->{'defdest'};
+ $defdelay = $settings->{$item}->{'defdelay'};
+ }
} elsif ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) {
$currvalid = $settings->{$item}->{$extra.'valid'};
}
@@ -6690,7 +6745,7 @@ sub print_ltitools {
&mt('No').''.(' 'x2).
'';
- if ($extra eq 'returnurl') {
+ if (($extra eq 'returnurl') || ($extra eq 'desturl')) {
$datatable .= '';
+ if ($extra eq 'desturl') {
+ $datatable .= '
';
+ }
}
$datatable .= ''.$lt{'icon'}.': ';
if ($imgsrc) {
@@ -6898,14 +6962,14 @@ sub print_ltitools {
'passback' => '7',
'roster' => '300',
);
- foreach my $extra ('passback','roster','returnurl') {
+ foreach my $extra ('desturl','returnurl','passback','roster') {
my $onclick = ' onclick="toggleLTITools(this.form,'."'$extra','add'".');"';
$datatable .= ''.$lt{$extra}.' '.
''.(' 'x2).''.
'
';
- if ($extra eq 'returnurl') {
+ if (($extra eq 'returnurl') || ($extra eq 'desturl')) {
$datatable .= '';
+ if ($extra eq 'desturl') {
+ $datatable .= '
';
+ }
}
$datatable .= ''.$lt{'icon'}.': '.
'('.&mt('if larger than 21x21 pixels, image will be scaled').') ';
@@ -7015,13 +7088,15 @@ sub ltitools_names {
'explanation' => 'Default Explanation',
'passback' => 'Tool can return grades:',
'roster' => 'Tool can retrieve roster:',
- 'returnurl' => 'Return URL sent on launch:',
+ 'returnurl' => 'Return LONCAPA URL sent on launch:',
'crstarget' => 'Display target',
'crslabel' => 'Course label',
'crstitle' => 'Course title',
'crslinktext' => 'Link Text',
'crsexplanation' => 'Explanation',
'crsappend' => 'Provider URL',
+ 'desturl' => 'Destination URL different from Provider URL',
+ 'delay' => 'Second(s) delay before redirect to destination URL',
);
return %lt;
}