--- loncom/homework/daxepage.pm 2016/01/06 16:44:30 1.2 +++ loncom/homework/daxepage.pm 2023/11/27 23:24:04 1.9 @@ -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.2 2016/01/06 16:44:30 damieng Exp $ +# $Id: daxepage.pm,v 1.9 2023/11/27 23:24:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -28,45 +28,180 @@ ### package Apache::daxepage; +use strict; -use Apache::Constants; +use Apache::loncommon(); +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 { my $request = shift; my $uri = $request->uri; - $uri =~ s/^\/daxepage//; - &Apache::loncommon::no_cache($request); - if ($uri !~ /\.(task|problem|exam|quiz|assess|survey|library|xml|html|htm|xhtml|xhtm)$/) { + $uri =~ s{^/daxepage}{}; + &Apache::loncommon::content_type($request,'text/html'); + 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; } - my $result = ''; - $result .= "<!DOCTYPE html>\n"; - $result .= "<html>\n"; - $result .= "<head>\n"; + my %editors = &Apache::loncommon::permitted_editors(); + unless ($editors{'daxe'}) { + my $msg = '<p class="LC_warning">'. + &mt('Daxe editor is not enabled for this Authoring Space.').'</p>'; + &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', + 'oeds' => 'other editors', + 'othe' => 'other editor', + 'edit' => 'Edit', + ); my $name = $uri; $name =~ s/^.*\/([^\/]+)$/$1/; - $result .= " <title>LON-CAPA Daxe: $name</title>\n"; - $result .= ' <script src="/adm/split.js/split.min.js"></script>'."\n"; - $result .= ' <link rel="stylesheet" href="/adm/split.js/split.css">'."\n"; - $result .= " <style>\n"; - $result .= " #daxe, #preview { border: none; }\n"; - $result .= " </style>\n"; - $result .= "</head>\n"; - $result .= "<body>\n"; - $result .= ' <div class="split-parent">'."\n";; - my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&file=/daxeopen'.$uri. - '&save=/daxesave'; - $result .= ' <iframe id="daxe" src="'.$daxeurl.'" class="split split-horizontal"></iframe>'."\n"; - my $previewurl = $uri.'?inhibitmenu=yes'; - $result .= ' <iframe id="preview" src="'.$previewurl.'" class="split split-horizontal"></iframe>'."\n"; - $result .= " </div>\n"; - $result .= ' <script>Split(["#daxe", "#preview"], {sizes: [75, 25], minSize: [400, 20]});</script>'."\n"; - $result .= "</body>\n"; - $result .= "</html>\n"; - $request->print($result); + my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&save=/daxesave'. + '&file=/daxeopen'.$uri; + my $headjs = &Apache::loncommon::iframe_wrapper_headjs(). + &toggle_LCmenus_js(). + &Apache::edit::js_change_detection(); + if ($is_assess) { + $headjs .= &Apache::lonxml::setmode_javascript(); + } else { + $headjs .= &Apache::lonxml::seteditor_javascript(); + } + 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"; + if ($editors{'edit'} || $editors{'xml'}) { + my $other = (($editors{'edit'} && $editors{'xml'})? $lt{'oeds'} : $lt{'othe'}); + $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'. + $uri. + '</td><td align="right"><span class="LC_nobreak">'.$other.': '; + if ($is_not_assess) { + $editheader .= '<input type="hidden" name="editmode" value="" />'."\n". + '<input type="button" name="editordefault" value="'.$lt{'edit'}. + '" 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></td></tr></table>'; + } else { + $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'. + $uri. + '</td></tr></table>'; + } + $editheader .= '</div></form>'."\n"; + my $args = { + 'collapsible_header' => $editheader, + }; + my $startpage = &Apache::loncommon::start_page('Daxe: '.$name,$headjs,$args). + &Apache::lonmenu::constspaceform(); + my $endpage = &Apache::loncommon::end_page(); + + # javascript will position the iframe if window was resized (or zoomed) + my $script = &Apache::loncommon::iframe_wrapper_resizejs(); + my $dest = &HTML::Entities::encode($daxeurl,'&<>"'); + my $noiframe = &Apache::loncommon::modal_link($dest,$lt{'show'},500,400); + + $request->print(<<"ENDFRAME"); +$startpage +$script +<div class="LC_iframecontainer" style="padding-right: 5px"> +<iframe src="$dest">$lt{'noif'} $noiframe</iframe> +</div> +$endpage +ENDFRAME return OK; } +sub toggle_LCmenus_js { + my %lt = &Apache::lonlocal::texthash( + altc => 'menu state: collapsed', + alte => 'menu state: explanded', + ttlc => 'display standard menus', + ttle => 'hide standard menus', + ); + return <<"ENDJS"; +<script type="text/javascript"> +//<![CDATA[ +\$(document).ready (function () { + \$(".LC_collapse_trigger").on("click", function (e) { + var id = this.id; + var \$content = \$(this).next (".LC_menus_content"); + var expanded = \$content.hasClass ("shown"); + if (expanded) { + \$content.removeClass ("shown"); + \$content.addClass ("hidden"); + } else { + \$content.removeClass ("hidden"); + \$content.addClass ("shown"); + } + + \$(this).find ("[aria-expanded]") + .attr ("aria-expanded", !expanded); + + \$(this).find ("[aria-pressed]") + .attr ("aria-pressed", !expanded); + + \$(this).find (".LC_collapsible_indicator").attr ({ + "src": + (expanded)? "/res/adm/pages/collapsed.png" : "/res/adm/pages/expanded.png", + "alt": + (expanded)? "$lt{altc}" : "$lt{alte}", + "title": + (expanded)? "$lt{ttlc}" : "$lt{ttle}" + }); + + \$(window).trigger('resize'); + \$(this).focus (); + }); + + \$("#LC_expandingContainer").attr ("aria-live", "off"); +}); +//]]> +</script> +ENDJS + +} + +sub do_redirect { + my ($request,$uri,$msg) = @_; + &Apache::lonhtmlcommon::clear_breadcrumbs(); + $request->print( + &Apache::loncommon::start_page('Authoring Space',undef, + {'redirect' => [2,$uri]}). + + '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n". + "$msg\n". + &Apache::loncommon::end_page()); + return; +} + 1; __END__