--- loncom/homework/daxepage.pm 2016/02/14 16:07:13 1.4 +++ loncom/homework/daxepage.pm 2024/04/17 14:15:45 1.16 @@ -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.4 2016/02/14 16:07:13 raeburn Exp $ +# $Id: daxepage.pm,v 1.16 2024/04/17 14:15:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -28,39 +28,286 @@ ### package Apache::daxepage; +use strict; -use Apache::Constants; +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//; + $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,$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 $result = ''; - $result .= "\n"; - $result .= "\n"; - $result .= "\n"; + my %editors = &Apache::loncommon::permitted_editors($uri); + unless ($editors{'daxe'}) { + my $msg = '

'. + &mt('Daxe editor is not enabled for this Authoring Space.').'

'; + &do_redirect($request,$uri,$msg); + return OK; + } + if ($is_not_assess) { + delete($editors{'xml'}); + $editors{'edit'} = 1; + } + &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/; - $result .= " LON-CAPA Daxe: $name\n"; - $result .= " \n"; - $result .= "\n"; - $result .= "\n"; - my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&file=/daxeopen'.$uri. - '&save=/daxesave'; - $result .= ' '."\n"; - $result .= "\n"; - $result .= "\n"; - $request->print($result); + 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 = '
'; + if ($is_assess) { + $editheader .= ''."\n"; + } + $editheader .= '
'."\n"; + my $saveeditbutton = ''."\n"; + my $exitbutton = ''."\n"; + my $saveexitbutton = ''."\n"; + $editheader .= '
'. + $uri.''. + $saveeditbutton.$saveexitbutton.$exitbutton.''; + if ($editors{'edit'} || $editors{'xml'}) { + my $other = (($editors{'edit'} && $editors{'xml'})? $lt{'oeds'} : $lt{'othe'}); + $editheader .= '  |  '.$other.': '. + ''; + if ($is_not_assess) { + $editheader .= ''."\n". + ''."\n"; + } else { + if ($editors{'edit'}) { + $editheader .= ''."\n"; + } + if ($editors{'xml'}) { + $editheader .= ''."\n"; + } + } + $editheader .= ''; + } + $editheader .= '
'."\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 +
+ +
+$endpage +ENDFRAME return OK; } +sub listener_js { + my ($lang,$filearg,$is_assess) = @_; + return <<"ENDJS"; + +ENDJS + +} + +sub saveandview_js { + return <<"ENDJS"; + + +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"; + +ENDJS + +} + +sub do_redirect { + my ($request,$uri,$msg) = @_; + &Apache::lonhtmlcommon::clear_breadcrumbs(); + $request->print( + &Apache::loncommon::start_page('Authoring Space',undef, + {'redirect' => [2,$uri]}). + + '
'."\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__