--- 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 .= '
    '. ' -- '.&mt('configurable in course').': '. '
    '; + 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; }