--- loncom/homework/daxepage.pm	2023/11/27 23:24:04	1.9
+++ loncom/homework/daxepage.pm	2024/03/23 23:11:52	1.12
@@ -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.9 2023/11/27 23:24:04 raeburn Exp $
+# $Id: daxepage.pm,v 1.12 2024/03/23 23:11:52 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -31,6 +31,7 @@ package Apache::daxepage;
 use strict;
 
 use Apache::loncommon();
+use Apache::lonnet();
 use Apache::lonhtmlcommon();
 use Apache::lonxml();
 use Apache::edit();
@@ -71,31 +72,50 @@ sub handler {
     my %lt = &Apache::lonlocal::texthash(
                                           'noif' => 'No iframe support.',
                                           'show' => 'Show content in pop-up window',
+                                          'save' => 'Save',
                                           'oeds' => 'other editors',
                                           'othe' => 'other editor',
-                                          'edit' => 'Edit',
+                                          'edit' => 'Save and Edit',
+                                          'disc' => 'Discard and View',
+                                          'save' => 'Save and View',
                                         );
     my $name = $uri;
     $name =~ s/^.*\/([^\/]+)$/$1/;
+    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($filearg).
+                 &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 .= '<table class="LC_edit_problem_header_title"><tr><td>'.
-                       $uri.
-                       '</td><td align="right"><span class="LC_nobreak">'.$other.': ';
+        $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="" />'."\n".
                            '<input type="button" name="editordefault" value="'.$lt{'edit'}.
@@ -110,15 +130,13 @@ sub handler {
                                '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 .= '</span>';
     }
-    $editheader .= '</div></form>'."\n";
+    $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();
@@ -133,13 +151,57 @@ 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 ($filearg) = @_;
+    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;
+    if (e.origin == reqdOrigin) {
+        if (e.data == '$filearg') {
+            setmode(document.daxeedit,'view');
+        }
+        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',
@@ -203,5 +265,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__