--- loncom/interface/lonextresedit.pm 2016/01/26 14:30:25 1.9 +++ loncom/interface/lonextresedit.pm 2022/09/09 14:24:30 1.30 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: lonextresedit.pm,v 1.9 2016/01/26 14:30:25 raeburn Exp $ +# $Id: lonextresedit.pm,v 1.30 2022/09/09 14:24:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -60,7 +60,7 @@ sub handler { $symb,$type); if (($env{'form.folderpath'} =~ /^supplemental/) && ($env{'form.suppurl'})) { $supplementalflag = 1; - if (&unescape($env{'form.suppurl'}) =~ m{^/adm/$cdom/$cnum/\d+/exttools?$}) { + if (&unescape($env{'form.suppurl'}) =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) { $type = 'tool'; } } @@ -79,7 +79,7 @@ sub handler { if ($symb ne $env{'form.symb'}) { $env{'form.symb'} = $symb; } - if ($url =~ m{/adm/$cdom/$cnum/\d+/exttools?$}) { + if ($url =~ m{/adm/$cdom/$cnum/\d+/ext\.tool$}) { $type = 'tool'; } } @@ -98,7 +98,7 @@ sub handler { } my %ltitools; if ($type eq 'tool') { - %ltitools = &Apache::lonnet::get_domain_ltitools($cdom); + %ltitools = &Apache::lonnet::get_domain_lti($cdom,'consumer'); } my $js = &Apache::lonhtmlcommon::scripttag(&extedit_javascript()); my $pathitem = ''; if ($symb) { @@ -356,13 +443,13 @@ sub extedit_form { $active = ''; } $formname = 'edit'.$type.'_'.$residx; - $fieldsetid = 'upload'.$type.$residx; + $fieldsetid = 'external'.$type.$residx; $urlid = $type.'url_'.$residx; map { $toolattr{$_} .= '_'.$residx; } (keys(%toolattr)); $srcclass = ' class="LC_nobreak"'; if ($type eq 'ext') { $extsrc = ''.$lt{'ul'}.' '; - $preview = ' '.$lt{'pr'}.''; + $preview = ' '.$lt{'pr'}.''; } $title = ''.$lt{'ti'}.' '; $save = $lt{'sv'}; @@ -371,7 +458,7 @@ sub extedit_form { if ($type eq 'tool') { $link = $lt{'et'}; } - $link = ''.$link.''.$helpitem; + $link = ''.$link.''.$helpitem; if ($type eq 'tool') { $legend = $lt{'te'}; } else { @@ -384,27 +471,26 @@ sub extedit_form { $orig_url = 'http://'; $orig_title = $lt{'ex'}; $extsrc = $lt{'ul'}.':
'; - $preview = ''; + $preview = ''; $save = $lt{'al'}; } else { $orig_title = $lt{'et'}; $save = $lt{'at'}; - $orig_url = "/adm/$cdom/$cnum/new/exttool"; + $orig_url = "/adm/$cdom/$cnum/new/ext\.tool"; } $pathitem .= '
'; } $formid = $formname; if ($type eq 'ext') { - $urlelem = ''; + $urlelem = ''; } else { my $class = 'LC_nobreak'; if ($residx) { $class = 'LC_docs_ext_edit LC_nobreak'; - if ($orig_url =~ m{^/adm/$cdom/$cnum/(\d+)/exttools?$}) { + if ($orig_url =~ m{^/adm/$cdom/$cnum/(\d+)/ext\.tool$}) { my $marker = $1; my %toolhash=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); if ($toolhash{'id'}) { - $dispdivstyle = 'display:block'; if (ref($ltitools) eq 'HASH') { if (keys(%{$ltitools})) { if (ref($ltitools->{$toolhash{'id'}}) eq 'HASH') { @@ -414,16 +500,56 @@ sub extedit_form { if ($icon) { $image = ''.$tooltitle.''; } + if ($ltitools->{$toolhash{'id'}}->{'url'} =~ m{://}) { + (my $prot,my $host,$providerurl) = ($ltitools->{$toolhash{'id'}}->{'url'} =~ m{^([^/]+)://([^/]+)(|/.+)$}); + } else { + $providerurl = $ltitools->{$toolhash{'id'}}->{'url'}; + } $tooltarget = $toolhash{'target'}; if ($tooltarget eq 'window') { $dimendivstyle = 'display:block'; + $windivstyle = 'display:block'; $chkstate{'window'} = 'checked="checked" '; + } elsif ($tooltarget eq 'tab') { + $windivstyle = 'display:block'; + $chkstate{'tab'} = 'checked="checked" '; } else { $chkstate{'iframe'} = 'checked="checked" '; } $width = $toolhash{'width'}; $height = $toolhash{'height'}; + $linktext = $toolhash{'linktext'}; + $explanation = $toolhash{'explanation'}; + if ($toolhash{'gradable'}) { + $chkgrd = ' checked="checked"'; + } else { + $chknogrd = ' checked="checked"'; + } + if (ref($ltitools->{$toolhash{'id'}}->{'crsconf'}) eq 'HASH') { + if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'title'}) { + $crstitle = $toolhash{'crstitle'}; + $titlestyle = 'display:inline'; + } + if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'label'}) { + $crslabel = $toolhash{'crslabel'}; + $labelstyle = 'display:inline'; + } + if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'append'}) { + $crsappend = $toolhash{'crsappend'}; + $appendstyle = 'display:inline'; + } + if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'target'}) { + $dispdivstyle = 'display:block'; + } + if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'linktext'}) { + $linktextstyle = 'padding:0;display:inline'; + } + if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'explanation'}) { + $explanationstyle = 'padding:0;display:inline'; + } + } $toolelem = ''.$image.' '.$tooltitle.'
'; + $gradablestyle = 'display:inline'; } } } @@ -432,7 +558,7 @@ sub extedit_form { } else { $toolelem = ''."\n". ''; + $toolelem .= '
'; + $crslabel = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'}; + $crstitle = $env{'course.'.$cdom.'_'.$cnum.'.description'}; + $crsappend = ''; + $chknogrd = ' checked="checked"'; } $toolelem .= '
'. ''.&mt('Display target:').' '. ''.(' 'x2). + "'$toolattr{dimendiv}','$toolattr{windiv}','$toolattr{dimenwidth}','$toolattr{dimenheight}', + '$toolattr{linktext}','$toolattr{explanation}'".');"'.$disabled.' />'.&mt('iframe').''.(' 'x2). + ''.(' 'x2). ''. - '
'. - ''. - &mt('Width').''.(' 'x2). - &mt('Height').''."\n". + "'$toolattr{dimendiv}','$toolattr{windiv}','$toolattr{dimenwidth}','$toolattr{dimenheight}', + '$toolattr{linktext}','$toolattr{explanation}'".');"'.$disabled.' />'.&mt('window').''. + '
'. + &mt('Width').': '.(' 'x2). + &mt('Height').': '."\n". '
'; + $toolelem .= '
'. + '
'. + ''.&mt('Link Text').'
'. + '
'. + ''.&mt('Explanation').'
'. + '
'. + '
'; + $toolelem .= '
'. + ''.&mt('Course label:').' '. + '
'. + '
'. + '
'. + ''.&mt('Course title:').' '. + '
'. + '
'. + '
'. + ''.&mt('Append to URL[_1]', + ' ('.$providerurl.')
'). + '

'. + '
'. + '
'. + ''.&mt('Gradable').' '. + ''.(' 'x2). + '
'; } my $chooser = $toolelem; if ($type eq 'ext') { @@ -487,11 +649,11 @@ $chooser
$title - + $pathitem $hiddenelem - +
@@ -505,8 +667,8 @@ ENDFORM } sub display_editor { - my ($url,$folderpath,$symb,$idx,$type,$cdom,$cnum) = @_; - my ($residx,$supplementalflag,$title,$pathitem,$output,$js); + my ($url,$folderpath,$symb,$idx,$type,$cdom,$cnum,$hostname) = @_; + my ($residx,$supplementalflag,$title,$pathitem,$output,$js,$navmap); if ($folderpath =~ /^supplemental/) { $supplementalflag = 1; $residx = $idx; @@ -516,15 +678,18 @@ sub display_editor { (my $map,$residx,my $res) = &Apache::lonnet::decode_symb($symb); $title = &Apache::lonnet::gettitle($symb); - my $path = &Apache::loncommon::symb_to_docspath($symb); + my $path = &Apache::loncommon::symb_to_docspath($symb,\$navmap); $pathitem = ''; } my %ltitools; if ($type eq 'tool') { - %ltitools = &Apache::lonnet::get_domain_ltitools($cdom); + %ltitools = &Apache::lonnet::get_domain_lti($cdom,'consumer'); } $js = &Apache::lonhtmlcommon::scripttag(&extedit_javascript()); my $args = { 'force_register' => $env{'form.register'} }; + if ($hostname) { + $args->{'hostname'} = $hostname; + } my $description = 'External Resource Editor'; if ($type eq 'tool') { $description = 'External Tool Editor'; @@ -543,19 +708,57 @@ sub extedit_javascript { if (ref($toolsref) eq 'HASH') { my $num = scalar(keys(%{$toolsref})); $toolsjs = " var ltitools = new Array($num);\n". + " var ltitoolsUrl = new Array($num);\n". " var ltitoolsTarget = new Array($num);\n". " var ltitoolsWidth = new Array($num);\n". - " var ltitoolsHeight = new Array($num);\n"; + " var ltitoolsHeight = new Array($num);\n". + " var ltitoolsLinkDef = new Array($num);\n". + " var ltitoolsExplainDef = new Array($num);\n". + " var ltitoolsDisplay = new Array($num);\n". + " var ltitoolsLink = new Array($num);\n". + " var ltitoolsExplain = new Array($num);\n". + " var ltitoolsLabel = new Array($num);\n". + " var ltitoolsTitle = new Array($num);\n". + " var ltitoolsAppend = new Array($num);\n"; my $i = 0; foreach my $key (sort { $a <=> $b } keys(%{$toolsref})) { - if (ref($toolsref->{$key})) { - my $target = $toolsref->{$key}->{'target'}; - my $width = $toolsref->{$key}->{'width'}; - my $height = $toolsref->{$key}->{'height'}; - $toolsjs .= ' ltitools['.$i.'] = '."'$key';\n". - ' ltitoolsTarget['.$i.'] = '."'$target';\n". - ' ltitoolsWidth['.$i.'] = '."'$width';\n". - ' ltitoolsHeight['.$i.'] = '."'$height';\n"; + if (ref($toolsref->{$key}) eq 'HASH') { + if (ref($toolsref->{$key}->{'display'}) eq 'HASH') { + my $target = $toolsref->{$key}->{'display'}->{'target'}; + my $width = $toolsref->{$key}->{'display'}->{'width'}; + my $height = $toolsref->{$key}->{'display'}->{'height'}; + my $linkdef = $toolsref->{$key}->{'display'}->{'linktext'}; + my $explaindef = $toolsref->{$key}->{'display'}->{'explanation'}; + my $providerurl; + if ($toolsref->{$key}->{'url'} =~ m{://}) { + (my $prot,my $host,$providerurl) = ($toolsref->{$key}->{'url'} =~ m{^([^/]+)://([^/]+)(|/.+)$}); + } else { + $providerurl = $toolsref->{$key}->{'url'}; + } + $providerurl = &LONCAPA::map::qtunescape($providerurl); + $toolsjs .= ' ltitools['.$i.'] = '."'$key';\n". + ' ltitoolsTarget['.$i.'] = '."'$target';\n". + ' ltitoolsWidth['.$i.'] = '."'$width';\n". + ' ltitoolsHeight['.$i.'] = '."'$height';\n". + ' ltitoolsLinkDef['.$i.'] = '."'$linkdef';\n". + ' ltitoolsExplainDef['.$i.'] = '."'$explaindef';\n". + ' ltitoolsUrl['.$i.'] = '."'$providerurl';\n"; + } + if (ref($toolsref->{$key}->{'crsconf'}) eq 'HASH') { + my $display = $toolsref->{$key}->{'crsconf'}->{'target'}; + $toolsjs .= ' ltitoolsDisplay['.$i.'] = '."'$display';\n"; + my $linktext = $toolsref->{$key}->{'crsconf'}->{'linktext'}; + $toolsjs .= ' ltitoolsLink['.$i.'] = '."'$linktext';\n"; + my $explanation = $toolsref->{$key}->{'crsconf'}->{'explanation'}; + $toolsjs .= ' ltitoolsExplain['.$i.'] = '."'$explanation';\n"; + my $label = $toolsref->{$key}->{'crsconf'}->{'label'}; + $toolsjs .= ' ltitoolsLabel['.$i.'] = '."'$label';\n"; + my $title = $toolsref->{$key}->{'crsconf'}->{'title'}; + $toolsjs .= ' ltitoolsTitle['.$i.'] = '."'$title';\n"; + my $append = $toolsref->{$key}->{'crsconf'}->{'append'}; + $toolsjs .= ' ltitoolsAppend['.$i.'] = '."'$append';\n"; + } + $i++; } } @@ -564,6 +767,12 @@ sub extedit_javascript { invurl => 'Invalid URL', titbl => 'Title is blank', invtool => 'Please select an external tool', + mixfra => 'Show preview in pop-up? (http in https page + no framing)', + mixonly => 'Show preview in pop-up? (http in https page)', + fraonly => 'Show preview in pop-up? (framing disallowed)', + nopopup => 'Pop-up blocked', + nopriv => 'Insufficient privileges to use preview', + badurl => 'URL is not: http://hostname/path or https://hostname/path', ); &js_escape(\%js_lt); @@ -575,7 +784,7 @@ ENDREGEXP var regexp = $urlregexp; -function setExternal(extform,residx,type,exttoolurl) { +function setExternal(extform,residx,type,exttoolurl,supplementalflag) { var title=extform.exttitle.value; if (!String.trim) { String.prototype.trim = function() {return this.replace(\/^\\s+|\\s+$\/g, "");}; } @@ -610,20 +819,123 @@ function setExternal(extform,residx,type } info += ':'+toolid; } - if (extform.exttooltarget.length) { - for (var i=0; i 0) { + dispdiv += '_'+residx; + windiv += '_'+residx; + } + if (document.getElementById(dispdiv)) { + if (document.getElementById(dispdiv).style.display == 'block') { + if (extform.exttooltarget.length) { + for (var i=0; i 0) { + linktextdiv += '_'+residx; + explanationdiv += '_'+residx; + } + if (document.getElementById(linktextdiv).style.display == 'inline') { + var linktext = extform.exttoollinktext.value; + linktext.trim(); + info += ':'+escape(linktext); + } else { + info += ':'; + } + if (document.getElementById(explanationdiv).style.display == 'inline') { + var explaintext = extform.exttoolexplanation.value; + explaintext.trim(); + info += ':'+escape(explaintext); + } else { + info += ':'; + } + } else { + info += '::'; + } + } else { + info += '::'; + } + var labelinput = prefix+'toolcrslabel'; + var titleinput = prefix+'toolcrstitle'; + var appendinput = prefix+'toolcrsappend'; + if (residx > 0) { + labelinput += '_'+residx; + titleinput += '_'+residx; + appendinput += '_'+residx; + } + if (document.getElementById(labelinput)) { + var crslabel = document.getElementById(labelinput).value; + crslabel.trim(); + info += ':'+escape(crslabel); + } else { + info += ':'; + } + if (document.getElementById(titleinput)) { + var crstitle = document.getElementById(titleinput).value; + crstitle.trim(); + info += ':'+escape(crstitle); + } else { + info += ':'; + } + if (document.getElementById(appendinput)) { + var crsappend = document.getElementById(appendinput).value; + crsappend.trim(); + info += ':'+escape(crsappend); + } else { + info += ':'; + } + var gradablediv = prefix+'toolgradablediv'; + if (residx > 0) { + gradablediv += '_'+residx; + } + if (document.getElementById(gradablediv)) { + if (document.getElementById(gradablediv).style.display == 'inline') { + if (extform.exttoolgradable.length) { + for (var i=0; i 0) { @@ -635,30 +947,94 @@ function setExternal(extform,residx,type } function editext(residx,type) { - if (document.getElementById('upload'+type+residx)) { - var curr = document.getElementById('upload'+type+residx).style.display; + if (document.getElementById('external'+type+residx)) { + var curr = document.getElementById('external'+type+residx).style.display; if (curr == 'none') { disp = 'block'; } else { disp = 'none'; } - document.getElementById('upload'+type+residx).style.display=disp; + document.getElementById('external'+type+residx).style.display=disp; } resize_scrollbox('contentscroll','1','1'); return; } -function extUrlPreview(caller) { +function extUrlPreview(caller,protocol) { if (document.getElementById(caller)) { var url = document.getElementById(caller).value; if (regexp.test(url)) { - openMyModal(url,500,400,'yes'); + var http_regex = /^http\:\/\//gi; + var mixed = 0; + var noiframe = 0; + var nopriv = 0; + var badurl = 0; + var name = "externalpreview"; + if ((protocol == 'https') && (http_regex.test(url))) { + mixed = 1; + } + var http = new XMLHttpRequest(); + var lcurl = "/adm/exturlcheck"; + var params = "exturl="+url; + http.open("POST",lcurl, true); + http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http.onreadystatechange = function() { + if (http.readyState == 4) { + if (http.status == 200) { + if (http.responseText.length > 0) { + if (http.responseText == 1) { + noiframe = 1; + } else if (http.responseText == -1) { + nopriv = 1; + } else if (http.responseText == 0) { + badurl = 1; + } + } + openPreviewWindow(url,name,noiframe,mixed,nopriv,badurl); + } + } + } + http.send(params); } else { alert("$js_lt{'invurl'}"); } } } +var previewLCWindow = null; +function openPreviewWindow(url,name,noiframe,mixed,nopriv,badurl) { + if (previewLCWindow !=null) { + previewLCWindow.close(); + } + if (badurl) { + alert("$js_lt{'badurl'}"); + } else if (nopriv) { + alert("$js_lt{'nopriv'}"); + } else if ((noiframe == 1) || (mixed == 1)) { + var encurl = encodeURI(url); + var msg; + if (mixed == 1) { + if (noiframe == 1) { + msg = "$js_lt{'mixfra'}"; + } else { + msg = "$js_lt{'mixonly'}"; + } + } else { + msg = "$js_lt{'fraonly'}"; + } + if (confirm(msg)) { + previewLCWindow = window.open(url,name,"height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1"); + if (previewLCWindow != null) { + previewLCWindow.focus(); + } else { + alert("$js_lt{'nopopup'}"); + } + } + } else { + openMyModal(url,500,400,'yes'); + } +} + function updateExttool(caller,form,supplementalflag) { var prefix = ''; if (supplementalflag == 1) { @@ -666,8 +1042,21 @@ function updateExttool(caller,form,suppl } dispdiv = prefix+'tooldispdiv'; dimendiv = prefix+'tooldimendiv'; - widthinput = prefix+'toolwidth'; - heightinput = prefix+'toolheight'; + widthinput = prefix+'tooldimenwidth'; + heightinput = prefix+'tooldimenheight'; + labeldiv = prefix+'toolcrslabeldiv'; + titlediv = prefix+'toolcrstitlediv'; + appenddiv = prefix+'toolcrsappenddiv'; + gradablediv = prefix+'toolgradablediv'; + providerurl = prefix+'toolproviderurl'; + labelinput = prefix+'toolcrslabel'; + titleinput = prefix+'toolcrstitle'; + appendinput = prefix+'toolcrsappend'; + windiv = prefix+'toolwindiv'; + linktextdiv = prefix+'toollinktextdiv'; + linktextinput = prefix+'toollinktext'; + explanationdiv = prefix+'toolexplanationdiv'; + explanationinput = prefix+'toolexplanation'; if (document.getElementById(dispdiv)) { var toolpick = caller.options[caller.selectedIndex].value; $toolsjs @@ -678,65 +1067,171 @@ function updateExttool(caller,form,suppl if (document.getElementById(dimendiv)) { document.getElementById(dimendiv).style.display = 'none'; } - } else { - if (document.getElementById(dispdiv)) { - document.getElementById(dispdiv).style.display = 'block'; + if (document.getElementById(windiv)) { + document.getElementById(windiv).style.display = 'none'; + } + if (document.getElementById(linktextdiv)) { + document.getElementById(linktextdiv).style.display = 'none'; + } + if (document.getElementById(explanationdiv)) { + document.getElementById(explanationdiv).style.display = 'none'; + } + if (document.getElementById(labeldiv)) { + document.getElementById(labeldiv).style.display = 'none'; } + if (document.getElementById(titlediv)) { + document.getElementById(titlediv).style.display = 'none'; + } + if (document.getElementById(appenddiv)) { + document.getElementById(appenddiv).style.display = 'none'; + } + if (document.getElementById(gradablediv)) { + document.getElementById(gradablediv).style.display = 'none'; + } + } else { if (ltitools.length > 0) { for (var j=0; j'; + } + } + } else { + document.getElementById(appenddiv).style.display = 'none'; + if (document.getElementById(providerurl)) { + document.getElementById(providerurl).innerHTML = ''; + } + } } - if (document.getElementById(heightinput)) { - document.getElementById(heightinput).value = dimenheight; + if (document.getElementById(gradablediv)) { + if (supplementalflag != 1) { + document.getElementById(gradablediv).style.display = 'inline'; + } } + break; } - break; } } } } } -function updateTooldim(form,dimendiv,widthinput,heightinput) { +function updateTooldim(form,dimendiv,windiv,widthinput,heightinput,linkinput,explaininput) { if (form.exttooltarget.length) { for (var i=0; i