--- loncom/homework/daxepage.pm 2023/11/26 02:11:19 1.7 +++ loncom/homework/daxepage.pm 2024/03/31 01:50:18 1.14 @@ -1,7 +1,7 @@ # The LearningOnline Network # Page with Daxe on the left side and the preview on the right side # -# $Id: daxepage.pm,v 1.7 2023/11/26 02:11:19 raeburn Exp $ +# $Id: daxepage.pm,v 1.14 2024/03/31 01:50:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -31,10 +31,14 @@ package Apache::daxepage; use strict; use Apache::loncommon(); +use Apache::lonnet(); use Apache::lonhtmlcommon(); +use Apache::lonxml(); +use Apache::edit(); use Apache::lonmenu(); use Apache::lonlocal; use Apache::Constants qw(:common); +use LONCAPA qw(:DEFAULT :match); use HTML::Entities(); sub handler { @@ -42,7 +46,15 @@ sub handler { my $uri = $request->uri; $uri =~ s{^/daxepage}{}; &Apache::loncommon::content_type($request,'text/html'); - if ($uri !~ /\.(task|problem|exam|quiz|assess|survey|library|xml|html|htm|xhtml|xhtm)$/) { + my ($is_not_assess,$is_assess); + if ($uri =~/\.(xml|html|htm|xhtml|xhtm)$/) { + $is_not_assess = 1; + } elsif ($uri =~ /$LONCAPA::assess_re/) { + unless ($uri =~ /\.form$/) { + $is_assess = 1; + } + } + unless ($is_not_assess || $is_assess) { $request->status(406); return OK; } @@ -53,18 +65,80 @@ sub handler { &do_redirect($request,$uri,$msg); return OK; } + if ($is_not_assess) { + delete($editors{'xml'}); + $editors{'edit'} = 1; + } my %lt = &Apache::lonlocal::texthash( 'noif' => 'No iframe support.', 'show' => 'Show content in pop-up window', + 'save' => 'Save', + 'text' => 'Text Editor', + 'oeds' => 'other editors', + 'othe' => 'other editor', + 'edit' => 'Save and Edit', + 'disc' => 'Discard and View', + 'save' => 'Save and View', ); my $name = $uri; $name =~ s/^.*\/([^\/]+)$/$1/; + my $lang = &Apache::lonlocal::current_language(); + my $filearg = '/daxeopen'.$uri; my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&save=/daxesave'. - '&file=/daxeopen'.$uri; + '&file='.$filearg; my $headjs = &Apache::loncommon::iframe_wrapper_headjs(). - &toggle_LCmenus_js(); + &listener_js($lang,$filearg,$is_assess). + &toggle_LCmenus_js().&saveandview_js(). + &Apache::edit::js_change_detection(); + + my ($clickexit,$clicksave,$clickedit); + if ($is_assess) { + $headjs .= &Apache::lonxml::setmode_javascript(); + $clickexit = "javascript:setmode(this.form,'view');"; + } else { + $headjs .= &Apache::lonxml::seteditor_javascript(); + $clickexit = "javascript:seteditmode(this.form,'view');"; + } + $clicksave = "javascript:daxesave('exit');"; + $clickedit = "javascript:daxesave();"; + my $form_events = &Apache::edit::form_change_detection(); + my $editheader = '<form '.$form_events.' method="post" name="daxeedit" action="'.$uri.'">'. + '<input type="hidden" name="problemmode" value="daxe" />'."\n". + '<div class="LC_edit_problem_editxml_header">'."\n"; + my $saveeditbutton = '<input type="button" name="submitmode" accesskey="s" value="'.$lt{'edit'}. + '" onclick="'.$clickedit.'" />'."\n"; + my $exitbutton = '<input type="button" name="submitmode" accesskey="d" value="'.$lt{'disc'}. + '" onclick="'.$clickexit.'" />'."\n"; + my $saveexitbutton = '<input type="button" name="submitmode" accesskey="v" value="'.$lt{'save'}. + '" onclick="'.$clicksave.'" />'."\n"; + $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'. + $uri.'</td><td align="right"><span class="LC_nobreak">'. + $saveeditbutton.$saveexitbutton.$exitbutton.'</span>'; + if ($editors{'edit'} || $editors{'xml'}) { + my $other = (($editors{'edit'} && $editors{'xml'})? $lt{'oeds'} : $lt{'othe'}); + $editheader .= ' | <span class="LC_nobreak">'.$other.':</span> '. + '<span class="LC_nobreak">'; + if ($is_not_assess) { + $editheader .= '<input type="hidden" name="editmode" value="" />'."\n". + '<input type="button" name="editordefault" value="'.$lt{'text'}. + '" onclick="seteditmode(this.form,'."'edit'".');" />'."\n"; + } else { + if ($editors{'edit'}) { + $editheader .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '. + 'onclick="javascript:setmode(this.form,'."'edit'".')" />'."\n"; + } + if ($editors{'xml'}) { + $editheader .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '. + 'onclick="javascript:setmode(this.form,'."'editxml'".')" />'."\n"; + } + } + $editheader .= '</span>'; + } + $editheader .= '</td></tr></table></div></form>'."\n"; + my $start_collapsed = &collapsible_std_LCmenus(); my $args = { - 'collapsible_header' => 1, + 'collapsible_header' => $editheader, + 'start_collapsed' => $start_collapsed, }; my $startpage = &Apache::loncommon::start_page('Daxe: '.$name,$headjs,$args). &Apache::lonmenu::constspaceform(); @@ -79,13 +153,65 @@ sub handler { $startpage $script <div class="LC_iframecontainer" style="padding-right: 5px"> -<iframe src="$dest">$lt{'noif'} $noiframe</iframe> +<iframe src="$dest" id="lcdiframe">$lt{'noif'} $noiframe</iframe> </div> $endpage ENDFRAME return OK; } +sub listener_js { + my ($lang,$filearg,$is_assess) = @_; + return <<"ENDJS"; +<script type="text/javascript"> +//<![CDATA[ + +var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; +var eventer = window[eventMethod]; +var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; + +eventer(messageEvent,function(e) { + var reqdOrigin = window.location.protocol+'//'+window.location.hostname; + var is_assess = '$is_assess'; + if (e.origin == reqdOrigin) { + if (e.data == '$filearg') { + if (is_assess) { + setmode(document.daxeedit,'view'); + } else { + seteditmode(document.daxeedit,'view'); + } + } else if ((e.data == 'userlclang') || (e.data == 'userlang')) { + window.myIframe = document.getElementById("lcdiframe").contentWindow; + window.myIframe.postMessage(e.data+':$lang',reqdOrigin); + } + return; + } +},false); + +//]]> +</script> +ENDJS + +} + +sub saveandview_js { + return <<"ENDJS"; + +<script type="text/javascript"> +//<![CDATA[ + +function daxesave(exit) { + window.myIframe = document.getElementById("lcdiframe").contentWindow; + window.myIframe.focus(); + window.myIframe.savelcdoc(exit); + return; +} + +//]]> +</script> +ENDJS +} + sub toggle_LCmenus_js { my %lt = &Apache::lonlocal::texthash( altc => 'menu state: collapsed', @@ -101,7 +227,6 @@ sub toggle_LCmenus_js { var id = this.id; var \$content = \$(this).next (".LC_menus_content"); var expanded = \$content.hasClass ("shown"); - var frameleftpos; if (expanded) { \$content.removeClass ("shown"); \$content.addClass ("hidden"); @@ -150,5 +275,19 @@ sub do_redirect { return; } +sub collapsible_std_LCmenus { + my $daxecollapse = $Apache::lonnet::env{'environment.daxecollapse'}; + unless ($daxecollapse) { + my %domdefs = &Apache::lonnet::get_domain_defaults($Apache::lonnet::env{'user.domain'}); + if ($domdefs{'daxecollapse'}) { + $daxecollapse = 'yes'; + } + } + if ($daxecollapse eq 'yes') { + return 1; + } + return; +} + 1; __END__