File:  [LON-CAPA] / loncom / homework / daxepage.pm
Revision 1.17: download - view: text, annotated - select for diffs
Fri Apr 19 03:48:23 2024 UTC (8 months, 1 week ago) by raeburn
Branches: MAIN
CVS tags: version_2_12_X, version_2_11_5_msu, version_2_11_4_msu, HEAD
- No breadcrumbs in LON-CAPA menus when using Daxe editor to edit file in
  Authoring Space, so include "Exit Daxe" icon/link in Functions menu.

# The LearningOnline Network
# Page with Daxe on the left side and the preview on the right side
#
# $Id: daxepage.pm,v 1.17 2024/04/19 03:48:23 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
###

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 {
    my $request = shift;
    my $uri = $request->uri;
    $uri =~ s{^/daxepage}{};
    &Apache::loncommon::content_type($request,'text/html');
    my ($is_not_assess,$is_assess,$is_course_doc,$is_supp,$supp_path,$supp_title);
    if ($uri =~/\.(xml|html|htm|xhtml|xhtm)$/) {
        $is_not_assess = 1;
        if ($Apache::lonnet::env{'request.course.id'}) {
            my $cid = $Apache::lonnet::env{'request.course.id'};
            my $cdom = $Apache::lonnet::env{'course.'.$cid.'.domain'};
            my $cnum = $Apache::lonnet::env{'course.'.$cid.'.num'};
            if ($uri =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}) {
                if ($1 eq 'supplemental') {
                    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                                            ['folderpath','title']);
                    $is_supp = 1;
                    $supp_path = &escape(&HTML::Entities::decode($Apache::lonnet::env{'form.folderpath'}));
                    $supp_title = &escape(&HTML::Entities::decode($Apache::lonnet::env{'form.title'}));
                }
                $is_course_doc = 1;
                $Apache::lonnet::env{'form.forceedit'} = 1;
            }
        }
    } elsif ($uri =~ /$LONCAPA::assess_re/) {
        unless ($uri =~ /\.form$/) {
            $is_assess = 1;
        }
    }
    unless ($is_not_assess || $is_assess) {
        $request->status(406);
        return OK;
    }
    my %editors = &Apache::loncommon::permitted_editors($uri);
    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;
        $Apache::lonnet::env{'form.editmode'} = 'daxe';
    } else {
        $Apache::lonnet::env{'form.problemmode'} = 'daxe';
    }
    &Apache::lonhtmlcommon::clear_breadcrumbs();
    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='.$filearg;
    my $headjs = &Apache::loncommon::iframe_wrapper_headjs().
                 &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($is_course_doc,$is_supp,
                                                         $supp_path,$supp_title);
        $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.'">';
    if ($is_assess) {
        $editheader .= '<input type="hidden" name="problemmode" value="daxe" />'."\n";
    }
    $editheader .= '<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 .= '&nbsp;&nbsp;|&nbsp;&nbsp;<span class="LC_nobreak">'.$other.':</span> '.
                       '<span class="LC_nobreak">';
        if ($is_not_assess) {
            $editheader .= '<input type="hidden" name="editmode" value="daxe" />'."\n".
                           '<input type="button" name="editordefault" value="'.$lt{'text'}.
                           '" onclick="javascript: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' => $editheader,
                'start_collapsed'    => $start_collapsed,
               };
    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" 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',
                                         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;
}

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__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>