File:  [LON-CAPA] / loncom / homework / daxepage.pm
Revision 1.9: download - view: text, annotated - select for diffs
Mon Nov 27 23:24:04 2023 UTC (5 months, 2 weeks ago) by raeburn
Branches: MAIN
CVS tags: HEAD
- Include file path with colored background in collapsible header used for
  Daxe Editor page. Buttons to access other available editors at far right.

    1: # The LearningOnline Network
    2: # Page with Daxe on the left side and the preview on the right side
    3: #
    4: # $Id: daxepage.pm,v 1.9 2023/11/27 23:24:04 raeburn Exp $
    5: #
    6: # Copyright Michigan State University Board of Trustees
    7: #
    8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    9: #
   10: # LON-CAPA is free software; you can redistribute it and/or modify
   11: # it under the terms of the GNU General Public License as published by
   12: # the Free Software Foundation; either version 2 of the License, or
   13: # (at your option) any later version.
   14: #
   15: # LON-CAPA is distributed in the hope that it will be useful,
   16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: # GNU General Public License for more details.
   19: #
   20: # You should have received a copy of the GNU General Public License
   21: # along with LON-CAPA; if not, write to the Free Software
   22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   23: #
   24: # /home/httpd/html/adm/gpl.txt
   25: #
   26: # http://www.lon-capa.org/
   27: #
   28: ###
   29: 
   30: package Apache::daxepage;
   31: use strict;
   32: 
   33: use Apache::loncommon();
   34: use Apache::lonhtmlcommon();
   35: use Apache::lonxml();
   36: use Apache::edit();
   37: use Apache::lonmenu();
   38: use Apache::lonlocal;
   39: use Apache::Constants qw(:common);
   40: use LONCAPA qw(:DEFAULT :match);
   41: use HTML::Entities();
   42: 
   43: sub handler {
   44:     my $request = shift;
   45:     my $uri = $request->uri;
   46:     $uri =~ s{^/daxepage}{};
   47:     &Apache::loncommon::content_type($request,'text/html');
   48:     my ($is_not_assess,$is_assess);
   49:     if ($uri =~/\.(xml|html|htm|xhtml|xhtm)$/) {
   50:         $is_not_assess = 1;
   51:     } elsif ($uri =~ /$LONCAPA::assess_re/) {
   52:         unless ($uri =~ /\.form$/) {
   53:             $is_assess = 1;
   54:         }
   55:     }
   56:     unless ($is_not_assess || $is_assess) {
   57:         $request->status(406);
   58:         return OK;
   59:     }
   60:     my %editors = &Apache::loncommon::permitted_editors();
   61:     unless ($editors{'daxe'}) {
   62:         my $msg = '<p class="LC_warning">'.
   63:                   &mt('Daxe editor is not enabled for this Authoring Space.').'</p>';
   64:         &do_redirect($request,$uri,$msg);
   65:         return OK;
   66:     }
   67:     if ($is_not_assess) {
   68:         delete($editors{'xml'});
   69:         $editors{'edit'} = 1;
   70:     }
   71:     my %lt = &Apache::lonlocal::texthash(
   72:                                           'noif' => 'No iframe support.',
   73:                                           'show' => 'Show content in pop-up window',
   74:                                           'oeds' => 'other editors',
   75:                                           'othe' => 'other editor',
   76:                                           'edit' => 'Edit',
   77:                                         );
   78:     my $name = $uri;
   79:     $name =~ s/^.*\/([^\/]+)$/$1/;
   80:     my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&save=/daxesave'.
   81:                   '&file=/daxeopen'.$uri;
   82:     my $headjs = &Apache::loncommon::iframe_wrapper_headjs().
   83:                  &toggle_LCmenus_js().
   84:                  &Apache::edit::js_change_detection();
   85:     if ($is_assess) {
   86:         $headjs .= &Apache::lonxml::setmode_javascript();
   87:     } else {
   88:         $headjs .= &Apache::lonxml::seteditor_javascript();
   89:     }
   90:     my $form_events = &Apache::edit::form_change_detection();
   91:     my $editheader = '<form '.$form_events.' method="post" name="daxeedit" action="'.$uri.'">'.
   92:                      '<input type="hidden" name="problemmode" value="daxe" />'."\n".
   93:                      '<div class="LC_edit_problem_editxml_header">'."\n";
   94:     if ($editors{'edit'} || $editors{'xml'}) {
   95:         my $other = (($editors{'edit'} && $editors{'xml'})? $lt{'oeds'} : $lt{'othe'});
   96:         $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'.
   97:                        $uri.
   98:                        '</td><td align="right"><span class="LC_nobreak">'.$other.': ';
   99:         if ($is_not_assess) {
  100:             $editheader .= '<input type="hidden" name="editmode" value="" />'."\n".
  101:                            '<input type="button" name="editordefault" value="'.$lt{'edit'}.
  102:                            '" onclick="seteditmode(this.form,'."'edit'".');" />'."\n";
  103:         } else {
  104:             if ($editors{'edit'}) {
  105:                 $editheader .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
  106:                                'onclick="javascript:setmode(this.form,'."'edit'".')" />'."\n";
  107:             }
  108:             if ($editors{'xml'}) {
  109:                 $editheader .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
  110:                                'onclick="javascript:setmode(this.form,'."'editxml'".')" />'."\n";
  111:             }
  112:         }
  113:         $editheader .= '</span></td></tr></table>';
  114:     } else {
  115:         $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'.
  116:                        $uri.
  117:                        '</td></tr></table>';
  118:     }
  119:     $editheader .= '</div></form>'."\n";
  120:     my $args = {
  121:                 'collapsible_header' => $editheader,
  122:                };
  123:     my $startpage = &Apache::loncommon::start_page('Daxe: '.$name,$headjs,$args).
  124:                     &Apache::lonmenu::constspaceform();
  125:     my $endpage = &Apache::loncommon::end_page();
  126: 
  127:     # javascript will position the iframe if window was resized (or zoomed)
  128:     my $script = &Apache::loncommon::iframe_wrapper_resizejs();
  129:     my $dest = &HTML::Entities::encode($daxeurl,'&<>"');
  130:     my $noiframe = &Apache::loncommon::modal_link($dest,$lt{'show'},500,400);
  131: 
  132:     $request->print(<<"ENDFRAME");
  133: $startpage
  134: $script
  135: <div class="LC_iframecontainer" style="padding-right: 5px">
  136: <iframe src="$dest">$lt{'noif'} $noiframe</iframe>
  137: </div>
  138: $endpage
  139: ENDFRAME
  140:     return OK;
  141: }
  142: 
  143: sub toggle_LCmenus_js {
  144:     my %lt = &Apache::lonlocal::texthash(
  145:                                          altc => 'menu state: collapsed',
  146:                                          alte => 'menu state: explanded',
  147:                                          ttlc => 'display standard menus',
  148:                                          ttle => 'hide standard menus',
  149:     );
  150:     return <<"ENDJS";
  151: <script type="text/javascript">
  152: //<![CDATA[
  153: \$(document).ready (function () {
  154:     \$(".LC_collapse_trigger").on("click", function (e) {
  155:         var id = this.id;
  156:         var \$content = \$(this).next (".LC_menus_content");
  157:         var expanded = \$content.hasClass ("shown");
  158:         if (expanded) {
  159:             \$content.removeClass ("shown");
  160:             \$content.addClass ("hidden");
  161:         } else {
  162:             \$content.removeClass ("hidden");
  163:             \$content.addClass ("shown");
  164:         }
  165: 
  166:         \$(this).find ("[aria-expanded]")
  167:         .attr ("aria-expanded", !expanded);
  168: 
  169:         \$(this).find ("[aria-pressed]")
  170:         .attr ("aria-pressed", !expanded);
  171: 
  172:         \$(this).find (".LC_collapsible_indicator").attr ({
  173:         "src":
  174:         (expanded)? "/res/adm/pages/collapsed.png" : "/res/adm/pages/expanded.png",
  175:         "alt":
  176:         (expanded)? "$lt{altc}" : "$lt{alte}",
  177:         "title":
  178:         (expanded)? "$lt{ttlc}" : "$lt{ttle}"
  179:         });
  180: 
  181:         \$(window).trigger('resize');
  182:         \$(this).focus ();
  183:     });
  184: 
  185:     \$("#LC_expandingContainer").attr ("aria-live", "off");
  186: });
  187: //]]>
  188: </script>
  189: ENDJS
  190: 
  191: }
  192: 
  193: sub do_redirect {
  194:     my ($request,$uri,$msg) = @_;
  195:     &Apache::lonhtmlcommon::clear_breadcrumbs();
  196:     $request->print(
  197:         &Apache::loncommon::start_page('Authoring Space',undef,
  198:                                        {'redirect'       => [2,$uri]}).
  199: 
  200:         '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
  201:         "$msg\n".
  202:         &Apache::loncommon::end_page());
  203:     return;
  204: }
  205: 
  206: 1;
  207: __END__

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