--- loncom/interface/lonextresedit.pm 2016/11/22 00:43:12 1.11 +++ loncom/interface/lonextresedit.pm 2017/05/10 13:49:14 1.19 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: lonextresedit.pm,v 1.11 2016/11/22 00:43:12 raeburn Exp $ +# $Id: lonextresedit.pm,v 1.19 2017/05/10 13:49:14 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'; } } @@ -146,7 +146,7 @@ sub process_changes { $oldtitle = &unescape($env{'form.title'}); $container = 'sequence'; $supplementalflag = 1; - if ($oldurl =~ m{^/adm/$cdom/$cnum/\d+/exttools?$}) { + if ($oldurl =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) { $type = 'tool'; } else { $type = 'ext'; @@ -157,7 +157,7 @@ sub process_changes { if ($env{'form.importdetail'}) { ($newtitle,$newurl,$newidx) = map {&unescape($_)} split(/\=/,$env{'form.importdetail'}); - if ($newurl =~ m{^(/adm/$cdom/$cnum/(\d+)/exttools?)\:?(.*)$}) { + if ($newurl =~ m{^(/adm/$cdom/$cnum/(\d+)/ext\.tool)\:?(.*)$}) { $newurl = $1; $marker = $2; $args = $3; @@ -260,16 +260,22 @@ sub update_exttool { my ($marker,$cdom,$cnum,$args) = @_; my %toolhash=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); my (%newhash,$changed,@deleted,$errormsg); - ($newhash{'target'},$newhash{'width'},$newhash{'height'},$newhash{'crslabel'},$newhash{'crstitle'}) = split(/:/,$args); - $newhash{'crslabel'} = &unescape($newhash{'crslabel'}); - $newhash{'crstitle'} = &unescape($newhash{'crstitle'}); + ($newhash{'target'},$newhash{'width'},$newhash{'height'},$newhash{'linktext'},$newhash{'explanation'}, + $newhash{'crslabel'},$newhash{'crstitle'}) = split(/:/,$args); + foreach my $item ('linktext','explanation','crslabel','crstitle') { + $newhash{$item} = &unescape($newhash{$item}); + } my %toolhash=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); - foreach my $item ('target','width','height','crslabel','crstitle') { + foreach my $item ('target','width','height','linktext','explanation','crslabel','crstitle') { $newhash{$item} =~ s/^\s+//; $newhash{$item} =~ s/\s+$//; - if (($item eq 'width') || ($item eq 'height')) { + if (($item eq 'width') || ($item eq 'height') || ($item eq 'linktext') || ($item eq 'explanation')) { if ($newhash{'target'} eq 'iframe') { $newhash{$item} = ''; + } elsif ($newhash{'target'} eq 'tab') { + if (($item eq 'width') || ($item eq 'height')) { + $newhash{$item} = ''; + } } } if ($toolhash{$item} ne $newhash{$item}) { @@ -277,7 +283,10 @@ sub update_exttool { unless (($item eq 'target') || ((($item eq 'width') || ($item eq 'height')) && (($newhash{'target'} eq 'window') || - (($newhash{'target'} eq '') && ($toolhash{'target'} eq 'window'))))) { + (($newhash{'target'} eq '') && ($toolhash{'target'} eq 'window')))) || + ((($item eq 'linktext') || ($item eq 'explanation')) && + ((($newhash{'target'} =~ /^(window|tab)$/)) || + (($newhash{'target'} eq '') && ($toolhash{'target'} =~ /^(window|tab)$/))))) { delete($toolhash{$item}); push(@deleted,$item); $changed = 1; @@ -325,15 +334,21 @@ sub extedit_form { $tabid = 'ee'; } my ($formname,$formid,$toggle,$fieldsetid,$urlid,$dispdivstyle,$dimendivstyle, - $labelstyle,$titlestyle,$legend,$urlelem,$toolelem,%toolattr); + $windivstyle,$linktextstyle,$explanationstyle,$labelstyle,$titlestyle, + $legend,$urlelem,$toolelem,%toolattr); $formname = 'new'.$type; $toggle = $type; $fieldsetid = 'upload'.$type.'form'; $urlid = $type.'url'; map { $toolattr{$_} = $type.$_; } ('dispdiv','dimendiv','dimenwidth','dimenheight', - 'crstitlediv','crslabeldiv','crstitle','crslabel'); + 'crstitlediv','crslabeldiv','crstitle','crslabel', + 'windiv','linktextdiv','explanationdiv','linktext', + 'explanation'); $dispdivstyle = 'display:none'; $dimendivstyle = 'display:none'; + $windivstyle = 'display:none'; + $linktextstyle = 'display:none'; + $explanationstyle = 'display:none'; $labelstyle = 'display:none'; $titlestyle = 'display:none'; if ($supplementalflag) { @@ -344,13 +359,19 @@ sub extedit_form { map { $toolattr{$_} = 'supp'.$toolattr{$_}; } (keys(%toolattr)); } my ($link,$legend,$active,$srcclass,$extsrc,$preview,$title,$save,$crstitle,$crslabel, - $fieldsetstyle,$action,$hiddenelem,$form,$width,$height,$tooltarget,%chkstate); + $fieldsetstyle,$action,$hiddenelem,$form,$width,$height,$tooltarget, + $linktext,$explanation,%chkstate); $fieldsetstyle = 'display: none;'; $action = '/adm/coursedocs'; + my $protocol = ($ENV{'SERVER_PORT'} == 443?'https':'http'); + my $rows = 2; + my $cols = 20; if ($residx) { if ($caller eq 'direct') { $fieldsetstyle = 'display: block;'; $action = '/adm/extresedit'; + $rows = 10; + $cols = 45; if ($type eq 'tool') { $legend = $lt{'ee'}; } else { @@ -377,7 +398,7 @@ sub extedit_form { $srcclass = ' class="LC_nobreak"'; if ($type eq 'ext') { $extsrc = ''.$lt{'ul'}.' '; - $preview = ' '.$lt{'pr'}.''; + $preview = ' '.$lt{'pr'}.''; } $title = ''.$lt{'ti'}.' '; $save = $lt{'sv'}; @@ -399,12 +420,12 @@ 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 .= '
'; } @@ -415,7 +436,7 @@ sub extedit_form { 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'}) { @@ -431,12 +452,18 @@ sub extedit_form { $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 (ref($ltitools->{$toolhash{'id'}}->{'crsconf'}) eq 'HASH') { if ($ltitools->{$toolhash{'id'}}->{'crsconf'}->{'title'}) { $crstitle = $toolhash{'crstitle'}; @@ -449,6 +476,12 @@ sub extedit_form { 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.'
'; } @@ -486,21 +519,34 @@ sub extedit_form { $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:').' '. - '
'. + '

'. '
'; } my $chooser = $toolelem; @@ -528,7 +574,7 @@ $title $pathitem $hiddenelem - + @@ -542,8 +588,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; @@ -553,7 +599,7 @@ 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; @@ -562,6 +608,9 @@ sub display_editor { } $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'; @@ -583,23 +632,36 @@ sub extedit_javascript { " var ltitoolsTarget = new Array($num);\n". " var ltitoolsWidth = 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"; 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"; - my %courseconfig; + 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'}; + $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"; + } 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'}; @@ -664,8 +726,10 @@ function setExternal(extform,residx,type prefix = 'supp'; } var dispdiv = prefix+'tooldispdiv'; + var windiv = prefix+'toolwindiv'; if (residx > 0) { dispdiv += '_'+residx; + windiv += '_'+residx; } if (document.getElementById(dispdiv)) { if (document.getElementById(dispdiv).style.display == 'block') { @@ -677,7 +741,9 @@ function setExternal(extform,residx,type width.trim(); var height = extform.exttoolheight.value; height.trim(); - info += ':window:'+width+':'+height; + info += ':window:'+width+':'+height; + } else if (extform.exttooltarget[i].value == 'tab') { + info += ':tab::'; } else { info += ':iframe::'; } @@ -690,6 +756,34 @@ function setExternal(extform,residx,type } else { info += ':::'; } + if (document.getElementById(windiv)) { + if (document.getElementById(windiv).style.display == 'block') { + var linktextdiv = prefix+'toollinktextdiv'; + var explanationdiv = prefix+'toolexplanationdiv'; + if (residx > 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'; if (residx > 0) { @@ -733,11 +827,16 @@ function editext(residx,type) { 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; + if ((protocol == 'https') && (http_regex.test(url))) { + window.open(url,"externalpreview","height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1"); + } else { + openMyModal(url,500,400,'yes'); + } } else { alert("$js_lt{'invurl'}"); } @@ -751,12 +850,17 @@ 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'; labelinput = prefix+'toolcrslabel'; titleinput = prefix+'toolcrstitle'; + 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 @@ -767,6 +871,15 @@ function updateExttool(caller,form,suppl if (document.getElementById(dimendiv)) { document.getElementById(dimendiv).style.display = 'none'; } + 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'; } @@ -788,23 +901,57 @@ function updateExttool(caller,form,suppl } } } - if (ltitoolsTarget[j] == 'window') { - dimen = 'block'; - dimenwidth = ltitoolsWidth[j]; - dimenheight = ltitoolsHeight[j]; + } + var dimen = 'none'; + var dimenwidth = ''; + var dimenheight = ''; + if ((ltitoolsDisplay[j]) && (ltitoolsTarget[j] == 'window')) { + dimen = 'block'; + dimenwidth = ltitoolsWidth[j]; + dimenheight = ltitoolsHeight[j]; + } + if (document.getElementById(dimendiv)) { + document.getElementById(dimendiv).style.display = dimen; + } + if (document.getElementById(widthinput)) { + document.getElementById(widthinput).value = dimenwidth; + } + if (document.getElementById(heightinput)) { + document.getElementById(heightinput).value = dimenheight; + } + } + if (document.getElementById(windiv)) { + if ((ltitoolsTarget[j] == 'window') || (ltitoolsTarget[j] == 'tab')) { + document.getElementById(windiv).style.display = 'block'; + } else { + document.getElementById(windiv).style.display = 'none'; + } + if (document.getElementById(linktextdiv)) { + if (ltitoolsLink[j]) { + document.getElementById(linktextdiv).style.display = 'inline'; } else { - dimen = 'none'; - dimenwidth = ''; - dimenheight = ''; + document.getElementById(linktextdiv).style.display = 'none'; } - if (document.getElementById(dimendiv)) { - document.getElementById(dimendiv).style.display = dimen; + } + if (document.getElementById(linktextinput)) { + if (ltitoolsLink[j]) { + document.getElementById(linktextinput).value = ltitoolsLinkDef[j]; + } else { + document.getElementById(linktextinput).value = ''; } - if (document.getElementById(widthinput)) { - document.getElementById(widthinput).value = dimenwidth; + } + if (document.getElementById(explanationdiv)) { + if (ltitoolsExplain[j]) { + document.getElementById(explanationdiv).style.display = 'inline'; + } else { + document.getElementById(explanationdiv).style.display = 'none'; } - if (document.getElementById(heightinput)) { - document.getElementById(heightinput).value = dimenheight; + } + if (document.getElementById(explanationinput)) { + if (ltitoolsExplain[j]) { + document.getElementById(explanationinput).value = ltitoolsExplainDef[j]; + } else { + document.getElementById(explananationinput).value = ''; } } } @@ -830,24 +977,39 @@ function updateExttool(caller,form,suppl } } -function updateTooldim(form,dimendiv,widthinput,heightinput) { +function updateTooldim(form,dimendiv,windiv,widthinput,heightinput,linkinput,explaininput) { if (form.exttooltarget.length) { for (var i=0; i