From raeburn at source.lon-capa.org Fri Jun 13 22:50:26 2025 From: raeburn at source.lon-capa.org (raeburn) Date: Sat, 14 Jun 2025 02:50:26 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface courseprefs.pm lonconfigsettings.pm londocs.pm lonextresedit.pm lonexttool.pm Message-ID: raeburn Sat Jun 14 02:50:26 2025 EDT Modified files: /loncom/interface courseprefs.pm lonconfigsettings.pm londocs.pm lonextresedit.pm lonexttool.pm Log: - Destination URL which differs from launch URL can be specified for an LTI Provider which does not support specifying this in another way (e.g., via custom parameter in launch payload, or as string appended to launch URL). -------------- next part -------------- Index: loncom/interface/courseprefs.pm diff -u loncom/interface/courseprefs.pm:1.135 loncom/interface/courseprefs.pm:1.136 --- loncom/interface/courseprefs.pm:1.135 Tue May 13 04:07:07 2025 +++ loncom/interface/courseprefs.pm Sat Jun 14 02:50:25 2025 @@ -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 @@ } 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 @@ } 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 @@ $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 @@ $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 @@ } 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 @@ $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 @@ %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 @@ &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 @@ '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 @@ '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; } Index: loncom/interface/lonconfigsettings.pm diff -u loncom/interface/lonconfigsettings.pm:1.74 loncom/interface/lonconfigsettings.pm:1.75 --- loncom/interface/lonconfigsettings.pm:1.74 Sat Mar 15 01:03:33 2025 +++ loncom/interface/lonconfigsettings.pm Sat Jun 14 02:50:25 2025 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: lonconfigsettings.pm,v 1.74 2025/03/15 01:03:33 raeburn Exp $ +# $Id: lonconfigsettings.pm,v 1.75 2025/06/14 02:50:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -269,6 +269,7 @@ if (grep(/^ltitools$/, at actions)) { $onload .= "toggleLTITools(document.display,'passback','add');". "toggleLTITools(document.display,'roster','add');". + "toggleLTITools(document.display,'desturl','add');". "toggleLTITools(document.display,'returnurl','add');". "toggleLTITools(document.display,'user','add');"; if (ref($values) eq 'HASH') { @@ -277,6 +278,7 @@ for (my $i=0; $i<$numltitools; $i++) { $onload .= "toggleLTITools(document.display,'passback','$i');". "toggleLTITools(document.display,'roster','$i');". + "toggleLTITools(document.display,'desturl','$i');". "toggleLTITools(document.display,'returnurl','$i');". "toggleLTITools(document.display,'user','$i');"; } @@ -1120,10 +1122,14 @@ function toggleLTITools(form,setting,item) { var radioname = ''; var divid = ''; - if ((setting == 'passback') || (setting == 'roster') || (setting == 'returnurl')) { + var defdivid = ''; + if ((setting == 'passback') || (setting == 'roster') || (setting == 'returnurl') || (setting == 'desturl')) { radioname = 'ltitools_'+setting+'_'+item; - if (setting == 'returnurl') { + if ((setting == 'returnurl') || (setting == 'desturl')) { divid = 'ltitools_course'+setting+'_'+item; + if (setting == 'desturl') { + defdivid = 'ltitools_default'+setting+'_'+item; + } } else { divid = 'ltitools_'+setting+'time_'+item; } @@ -1135,6 +1141,9 @@ if (form.elements[radioname][i].value == '1') { if (document.getElementById(divid)) { document.getElementById(divid).style.display = 'inline-block'; + if ((setting == 'desturl') && (document.getElementById(defdivid))) { + document.getElementById(defdivid).style.display = 'inline-block'; + } } setvis = 1; } @@ -1146,6 +1155,9 @@ if (document.getElementById(divid)) { document.getElementById(divid).style.display = 'none'; } + if ((setting == 'desturl') && (document.getElementById(defdivid))) { + document.getElementById(defdivid).style.display = 'none'; + } } } if (setting == 'user') { Index: loncom/interface/londocs.pm diff -u loncom/interface/londocs.pm:1.727 loncom/interface/londocs.pm:1.728 --- loncom/interface/londocs.pm:1.727 Sat Mar 15 01:03:33 2025 +++ loncom/interface/londocs.pm Sat Jun 14 02:50:25 2025 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.727 2025/03/15 01:03:33 raeburn Exp $ +# $Id: londocs.pm,v 1.728 2025/06/14 02:50:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1704,7 +1704,7 @@ my $marker = $2; my $info = $3; my ($toolid,$toolprefix,$tooltype,%toolhash,%toolsettings); - my @extras = ('linktext','explanation','crslabel','crstitle','crsappend','returnurl','backtourl'); + my @extras = ('linktext','explanation','crslabel','crstitle','crsappend','returnurl','backtourl','desturl','delay'); my @toolinfo = split(/:/,$info); if ($residx) { %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$coursedom,$coursenum); @@ -1722,10 +1722,16 @@ ($toolhash{'target'},$toolhash{'width'},$toolhash{'height'}, $toolhash{'linktext'},$toolhash{'explanation'},$toolhash{'crslabel'}, $toolhash{'crstitle'},$toolhash{'crsappend'},$toolhash{'gradable'}, - $toolhash{'returnurl'},$toolhash{'backtourl'}) = @toolinfo; + $toolhash{'returnurl'},$toolhash{'backtourl'},$toolhash{'desturl'}, + $toolhash{'delay'}) = @toolinfo; foreach my $item (@extras) { $toolhash{$item} = &unescape($toolhash{$item}); } + foreach my $item ('crsappend','gradable','returnurl', + 'backtourl','desturl','delay') { + $toolhash{$item} =~ s/^\s+//; + $toolhash{$item} =~ s/\s+$//; + } if ($folder =~ /^supplemental/) { delete($toolhash{'gradable'}); } else { @@ -1786,6 +1792,7 @@ } } } + my $nocrsdest = 1; if (ref($tools{'crsconf'}) eq 'HASH') { foreach my $item ('label','title','linktext','explanation') { my $crsitem; @@ -1817,6 +1824,17 @@ delete($toolhash{'returnurl'}); delete($toolhash{'backtourl'}); } + if ($tools{'crsconf'}{'desturl'}) { + if ($toolhash{'desturl'} =~ m{^(https?\://|/)}) { + undef($nocrsdest); + } else { + delete($toolhash{'desturl'}); + delete($toolhash{'delay'}); + } + } else { + delete($toolhash{'desturl'}); + delete($toolhash{'delay'}); + } } if ($toolhash{'passback'}) { my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4); @@ -1828,6 +1846,17 @@ $toolhash{'rostersecret'} = $rostersecret; $toolhash{'rostersecretdate'} = time; } + if ($nocrsdest) { + foreach my $item ('desturl','delay') { + if (exists($toolhash{$item})) { + delete($toolhash{$item}); + } + } + } elsif (exists($toolhash{'delay'})) { + unless ($toolhash{'delay'} =~ /^(\d+\.?\d*)$/) { + delete($toolhash{'delay'}); + } + } my $changegradable; if (($residx) && ($folder =~ /^default/)) { if ($toolsettings{'gradable'}) { @@ -1852,6 +1881,12 @@ if (($toolsettings{'returnurl'} ne '') && (!exists($toolhash{'returnurl'}))) { push(@deleted,'returnurl'); } + if (($toolsettings{'desturl'} ne '') && (!exists($toolhash{'desturl'}))) { + push(@deleted,'desturl'); + } + if (($toolsettings{'delay'} ne '') && (!exists($toolhash{'delay'}))) { + push(@deleted,'delay'); + } } my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum); if ($putres eq 'ok') { Index: loncom/interface/lonextresedit.pm diff -u loncom/interface/lonextresedit.pm:1.36 loncom/interface/lonextresedit.pm:1.37 --- loncom/interface/lonextresedit.pm:1.36 Sat Mar 15 01:03:33 2025 +++ loncom/interface/lonextresedit.pm Sat Jun 14 02:50:25 2025 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: lonextresedit.pm,v 1.36 2025/03/15 01:03:33 raeburn Exp $ +# $Id: lonextresedit.pm,v 1.37 2025/06/14 02:50:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -310,12 +310,32 @@ my (%newhash,$changed,$newgradable, at deleted,$errormsg); ($newhash{'target'},$newhash{'width'},$newhash{'height'},$newhash{'linktext'},$newhash{'explanation'}, $newhash{'crslabel'},$newhash{'crstitle'},$newhash{'crsappend'},$newhash{'gradable'}, - $newhash{'returnurl'},$newhash{'backtourl'}) = split(/:/,$args); - foreach my $item ('linktext','explanation','crslabel','crstitle','crsappend','backtourl') { + $newhash{'returnurl'},$newhash{'backtourl'},$newhash{'desturl'},$newhash{'delay'}) = split(/:/,$args); + foreach my $item ('linktext','explanation','crslabel','crstitle','crsappend','backtourl','desturl','delay') { $newhash{$item} = &unescape($newhash{$item}); } my %toolhash=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); - foreach my $item ('target','width','height','linktext','explanation','crslabel','crstitle','crsappend','gradable','returnurl','backtourl') { + my ($tooltype,$tool,$ltihash); + if ($toolhash{'id'} =~/^c(\d+)$/) { + $tool = $1; + $tooltype = 'crs'; + } elsif ($toolhash{'id'} =~/^\d+$/) { + $tooltype = 'dom'; + $tool = $toolhash{'id'}; + } + if (($tool ne '') && ($tooltype ne '')) { + my %tools; + my %tooltypes = &Apache::loncommon::usable_exttools(); + if ($tooltypes{$tooltype}) { + if ($tooltype eq 'dom') { + %tools = &Apache::lonnet::get_domain_lti($cdom,'consumer'); + } elsif ($tooltypes{'crs'}) { + %tools = &Apache::lonnet::get_course_lti($cnum,$cdom,'consumer'); + } + $ltihash = $tools{$tool}; + } + } + foreach my $item ('target','width','height','linktext','explanation','crslabel','crstitle','crsappend','gradable','returnurl','backtourl','desturl','delay') { $newhash{$item} =~ s/^\s+//; $newhash{$item} =~ s/\s+$//; if (($item eq 'width') || ($item eq 'height') || ($item eq 'linktext') || ($item eq 'explanation')) { @@ -334,6 +354,22 @@ unless ($newhash{'returnurl'} eq 'custom') { $newhash{$item} = ''; } + } elsif ($item eq 'desturl') { + my $nocrsdest = 1; + if ((ref($ltihash) eq 'HASH') && (ref($ltihash->{'crsconf'}) eq 'HASH') && + ($ltihash->{'crsconf'}->{'desturl'})) { + undef($nocrsdest); + } + if ($nocrsdest) { + $newhash{$item} = ''; + } + } elsif ($item eq 'delay') { + if ($newhash{'desturl'} eq '') { + $newhash{$item} = ''; + } + unless ($newhash{$item} =~ /^(\d+\.?\d*)$/) { + $newhash{$item} = ''; + } } if ($toolhash{$item} ne $newhash{$item}) { if (($item eq 'gradable') && (!$supplementalflag)) { @@ -400,9 +436,9 @@ $tabid = 'ee'; } my ($formname,$formid,$toggle,$fieldsetid,$urlid,$subdivid,$dispdivstyle,$dimendivstyle, - $windivstyle,$linktextstyle,$explanationstyle,$labelstyle,$titlestyle, - $appendstyle,$gradablestyle,$returnurlstyle,$subdivstyle,$legend,$urlelem, - $toolelem,%toolattr); + $windivstyle,$linktextstyle,$explanationstyle,$labelstyle,$titlestyle,$providerstyle, + $appendstyle,$gradablestyle,$returnurlstyle,$subdivstyle,$desturlstyle, + $desturlinfostyle,$desturlfixedstyle,$legend,$urlelem,$toolelem,%toolattr); $formname = 'new'.$type; $toggle = $type; $fieldsetid = 'external'.$type.'form'; @@ -411,7 +447,9 @@ 'crstitlediv','crslabeldiv','crsappenddiv', 'gradablediv','returnurldiv','crstitle','crslabel', 'crsappend','windiv','linktextdiv','explanationdiv', - 'linktext','explanation','providerurl','customreturnurl'); + 'linktext','explanation','provider','providerpath','customreturnurl', + 'desturl','delay','providerdiv','desturldiv','desturlinfodiv', + 'desturlfixeddiv','fixeddest','fixeddelay'); $dispdivstyle = 'display:none'; $dimendivstyle = 'display:none'; $windivstyle = 'display:none'; @@ -419,9 +457,13 @@ $explanationstyle = 'display:none'; $labelstyle = 'display:none'; $titlestyle = 'display:none'; + $providerstyle = 'display:none'; $appendstyle = 'display:none'; $gradablestyle = 'display:none'; $returnurlstyle = 'display:none'; + $desturlstyle = 'display:none'; + $desturlinfostyle = 'display:none'; + $desturlfixedstyle = 'display:none'; $subdivstyle = 'display:block'; if ($supplementalflag) { $formname = 'newsupp'.$type; @@ -432,8 +474,9 @@ } my ($link,$legend,$active,$srcclass,$extsrc,$preview,$title,$save,$crstitle,$crslabel, $crsappend,$fieldsetstyle,$action,$hiddenelem,$form,$width,$height,$tooltarget, - $linktext,$explanation,$providerurl,$returnurl,$chkgrd,$chknogrd,%chkstate, - $chknoreturn,$chkreturndef,$chkreturncust,$customreturn,$backtourl); + $linktext,$explanation,$path,$returnurl,$chkgrd,$chknogrd,%chkstate, + $chknoreturn,$chkreturndef,$chkreturncust,$customreturn,$backtourl,$desturl,$delay, + $chknodest,$chkdest); $fieldsetstyle = 'display: none;'; $action = '/adm/coursedocs'; my $protocol = ($ENV{'SERVER_PORT'} == 443?'https':'http'); @@ -507,6 +550,7 @@ $urlelem = ''; } else { my $class = 'LC_nobreak'; + my ($nocrsdest,$fixeddest,$fixeddelay,$showprovider,$provider,$scheme); if ($residx) { $class = 'LC_docs_ext_edit LC_nobreak'; if ($orig_url =~ m{^/adm/$cdom/$cnum/(\d+)/ext\.tool$}) { @@ -516,18 +560,13 @@ if ($toolhash{'id'} =~/^c(\d+)$/) { $tool = $1; $tooltype = 'crs'; - if (ref($ltitools) eq 'HASH') { - if (ref($ltitools->{'crs'}) eq 'HASH') { - $ltihash = $ltitools->{'crs'}->{$tool}; - } - } } elsif ($toolhash{'id'} =~/^\d+$/) { $tooltype = 'dom'; $tool = $toolhash{'id'}; - if (ref($ltitools) eq 'HASH') { - if (ref($ltitools->{'dom'}) eq 'HASH') { - $ltihash = $ltitools->{'dom'}->{$tool}; - } + } + if (($tool ne '') && ($tooltype ne '') && (ref($ltitools) eq 'HASH')) { + if (ref($ltitools->{$tooltype}) eq 'HASH') { + $ltihash = $ltitools->{$tooltype}->{$tool}; } } if (($tool ne '') && (ref($ltihash) eq 'HASH')) { @@ -537,10 +576,10 @@ if ($icon) { $image = ''.$tooltitle.''; } - if ($ltihash->{'url'} =~ m{://}) { - (my $prot,my $host,$providerurl) = ($ltihash->{'url'} =~ m{^([^/]+)://([^/]+)(|/.+)$}); + if ($ltihash->{'url'} =~ m{^https?\://}) { + ($scheme,$provider,$path) = ($ltihash->{'url'} =~ m{^(https?\://)([^/]+)(|/.+)$}); } else { - $providerurl = $ltihash->{'url'}; + $path = $ltihash->{'url'}; } $tooltarget = $toolhash{'target'}; if ($tooltarget eq 'window') { @@ -574,6 +613,7 @@ if ($ltihash->{'crsconf'}->{'append'}) { $crsappend = $toolhash{'crsappend'}; $appendstyle = 'display:inline'; + $showprovider = 1; } if ($ltihash->{'crsconf'}->{'target'}) { $dispdivstyle = 'display:block'; @@ -599,9 +639,37 @@ $customreturn = 'hidden'; } } + if ($ltihash->{'crsconf'}->{'desturl'}) { + $desturl = $toolhash{'desturl'}; + $desturlstyle = 'display:inline'; + $delay = $toolhash{'delay'}; + $showprovider = 1; + if ($desturl ne '') { + $desturlinfostyle = 'display:inline'; + $chkdest = ' checked="checked"'; + $chknodest = ''; + } else { + $desturlinfostyle = 'display:none'; + $chkdest = ''; + $chknodest = ' checked="checked"'; + } + } else { + $nocrsdest = 1; + } } $toolelem = ''.$image.' '.$tooltitle.'
    '; $gradablestyle = 'display:inline'; + if (($ltihash->{'desturl'}) && ($nocrsdest) && ($ltihash->{'defdest'} =~ m{^(https?\://|/)})) { + $fixeddest = $ltihash->{'defdest'}; + if ($ltihash->{'defdelay'} =~ /^\d+\.?\d*$/) { + $fixeddelay = $ltihash->{'defdelay'}; + } + $desturlfixedstyle = 'display:inline-block'; + $showprovider = 1; + } + if (($showprovider) && ($provider ne '')) { + $providerstyle = 'display:inline-block'; + } } } } else { @@ -688,9 +756,42 @@ $chknoreturn = ''; $chkreturndef = ' checked="checked"'; $chkreturncust = ''; + $chknodest = ' checked="checked"'; + $chkdest = ''; } my $onclickreturl = ' onclick="updateReturnUrl('."this.form,'$toolattr{'customreturnurl'}','$toolattr{'returnurldiv'}','exttoolreturnurl'".');"'; - $toolelem .= '
    '. + my $onclickdest = ' onclick="updateDestUrl('."this.form,'$toolattr{'desturlinfodiv'}','$toolattr{'desturldiv'}','exttooldest'".');"'; + $toolelem.= '
    '. + ''.&mt('Provider').': '.$scheme.$provider.'
    '. + ''.&mt('Provider path').': '.$path.''."\n". + '
    '."\n". + '
    '. + '
    '. + ''.&mt('Append to LTI login URL').':
    '. + ''. + '
    '."\n". + '
    '. + '
    '. + ''.&mt('Post-login destination different from path').': '. + ''.(' 'x2). + ''.(' 'x2). + '
    '."\n". + '
    '. + ''. + '
    '. + '
    '."\n". + '
    '. + ''.&mt('Destination after provider login').': '. + '
    '.$fixeddest.'
    '. + '
    '. + &mt('Post-login delay before redirect to destination').': '.$fixeddelay.' s'."\n". + '
    '. + '
    '. + '
    '. ''.&mt('Display target:').' '. '
    '; - $toolelem .= '
    '. - '
    '. - ''.&mt('Link Text').'
    '. - '
    '. - ''.&mt('Explanation').'
    '. - '
    '. - '
    '; - $toolelem .= '
    '. + '
    '. + '
    '. + '
    '. + ''.&mt('Link Text').'
    '. + '
    '. + ''.&mt('Explanation').'
    '. + '
    '. + '
    '. + '
    '. ''.&mt('Course label:').' '. '
    '. '
    '."\n". @@ -722,11 +823,6 @@ ''.&mt('Course title:').' '. '
    '. ''."\n". - '
    '. - ''.&mt('Append to URL[_1]', - ' ('.$providerurl.')
    '). - '

    '. - '
    '."\n". '
    '. ''.&mt('Gradable').' '. '