[LON-CAPA-cvs] cvs: loncom /interface lonpreferences.pm

raeburn raeburn at source.lon-capa.org
Mon Nov 6 16:24:23 EST 2023


raeburn		Mon Nov  6 21:24:23 2023 EDT

  Modified files:              
    /loncom/interface	lonpreferences.pm 
  Log:
  - "Authoring Space Configuration" item in "Preferences" or "Editing Options"
    item in "Settings" in inline menu with Author or Co-Author role active
    override domain's Authoring Space defaults for CodeMirror deactivation,
    Copyright/Distribution and Source XML Availability.
  
  
-------------- next part --------------
Index: loncom/interface/lonpreferences.pm
diff -u loncom/interface/lonpreferences.pm:1.241 loncom/interface/lonpreferences.pm:1.242
--- loncom/interface/lonpreferences.pm:1.241	Thu Sep  8 01:41:13 2022
+++ loncom/interface/lonpreferences.pm	Mon Nov  6 21:24:23 2023
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.241 2022/09/08 01:41:13 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.242 2023/11/06 21:24:23 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2078,9 +2078,98 @@
     my $domain     = $env{'user.domain'};
     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
     if (keys(%author_roles) > 0) {
-            $r->print(Apache::loncommon::start_page('Authoring Space Settings'));
-            $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings'));
-            my %userenv = &Apache::lonnet::get('environment',['nocodemirror']);
+        my ($showdomdefs,$js,$args, at items);
+        my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
+        my $reqdmajor = 2;
+        my $reqdminor = 12;
+        my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'});
+        my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
+        unless (($major eq '' && $minor eq '') ||
+                ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor))) {
+            @items = ('nocodemirror','copyright','sourceavail');
+            $showdomdefs = 1;
+            $js = &toggle_options_js();
+            my $onload;
+            foreach my $item (@items) {
+                $onload .= "javascript:toggleOptions(document.prefs,'$item','user_$item');"
+            }
+            $args = { 'add_entries' => { 'onload' => $onload } };
+        }
+        $r->print(Apache::loncommon::start_page('Authoring Space Settings',$js,$args));
+        $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings'));
+        if ($showdomdefs) {
+            my %userenv = &Apache::lonnet::get('environment',\@items);
+            my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
+            my %staticdefaults = (
+                            'nocodemirror'  => '0',
+                            'copyright'     => 'default',
+                            'sourceavail'   => 'closed',
+            );
+            my %lt = &authoring_settings_text();
+            my %titles = &authoring_settings_titles();
+            $r->print("<h3>$lt{'auss'}</h3><br /><hr />\n".
+                      '<form name="prefs" action="/adm/preferences" method="post">'."\n".
+                      '<input type="hidden" name="returnurl" value="'.$returnurl.'" />'."\n".
+                      '<input type="hidden" name="action" value="change_authoring_settings" />'."\n");
+            foreach my $item (@items) {
+                my ($domdef,$checkeddom,$checkeduser,$domdefdisplay,$divsty,$userelem);
+                $checkeddom = ' checked="checked"';
+                $divsty = 'display:none';
+                if (exists($domdefs{$item})) {
+                    $domdef = $domdefs{$item};
+                } else {
+                    $domdef = $staticdefaults{$item};
+                }
+                if ($item eq 'copyright') {
+                    $domdefdisplay = &Apache::loncommon::copyrightdescription($domdef);
+                    $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'',
+                                           \&Apache::loncommon::copyrightdescription,
+                                           (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids)));
+                } elsif ($item eq 'sourceavail') {
+                    $domdefdisplay = &Apache::loncommon::source_copyrightdescription($domdef);
+                    $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'',
+                                           \&Apache::loncommon::source_copyrightdescription,
+                                           (&Apache::loncommon::source_copyrightids));
+                } elsif ($item eq 'nocodemirror') {
+                    if ($domdef) {
+                        $domdefdisplay = $lt{'yes'};
+                    } else {
+                        $domdefdisplay = $lt{'no'};
+                    }
+                    my %checked;
+                    $checked{'no'} = ' checked="checked"';
+                    if ($userenv{$item eq 'yes'}) {
+                        $checked{'yes'} = $checked{'no'};
+                        $checked{'no'} = '';
+                    }
+                    $userelem = '<span class="LC_nobreak">';
+                    foreach my $choice ('yes','no') {
+                        $userelem .= '<label><input type="radio" name="userchoice_'.$item.'" value="'.$choice.'"'.
+                                     $checked{$choice}.' />'.$lt{$choice}.'</label>   ';
+                    }
+                    $userelem .= '</span>';
+                }
+                if ($userenv{$item} ne '') {
+                    $checkeduser = $checkeddom;
+                    $checkeddom = '';
+                    $divsty = 'display:inline-block';
+                }
+                $r->print(<<"END");
+<h4><span class="LC_nobreak">$titles{$item}</span></h4>
+<p class="LC_nobreak">$lt{'curd'}: <span style="font-style:italic">$domdefdisplay</span></p>
+<p class="LC_nobreak">
+<label><input type="radio" name="$item" value="dom" onclick="toggleOptions(this.form,'$item','user_$item');"$checkeddom />$lt{'used'}</label>   
+<label><input type="radio" name="$item" value="user" onclick="toggleOptions(this.form,'$item','user_$item');"$checkeduser />$lt{'usyo'}</label></p>
+<fieldset id="user_$item" style="$divsty">
+<legend style="font-weight:normal;font-style:italic;">$lt{'ousv'}</legend>
+$userelem
+</fieldset><br /><hr />
+END
+            }
+            $r->print('<br />'.
+                      '<input type="submit" value="'.$lt{'save'}.'" />'.
+                      '</form>'."\n");
+        } else {
             my $constchecked='';
             if ($env{'environment.nocodemirror'}) {
                $constchecked=' checked="checked"';
@@ -2088,7 +2177,6 @@
             my $text=&mt('By default, CodeMirror an editor with advanced functionality for editing code is activated for authors.');
             my $cmoff=&mt('Deactivate CodeMirror. This can improve performance on slow computers and accessibility.');
             my $change=&mt('Save');
-            my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
             $r->print(<<ENDSCREEN);
         <form name="prefs" action="/adm/preferences" method="post">
         <input type="hidden" name="returnurl" value="$returnurl" />
@@ -2098,6 +2186,7 @@
         <input type="submit" value="$change" />
         </form>
 ENDSCREEN
+        }
     }
 }
 
@@ -2107,6 +2196,13 @@
     my $domain     = $env{'user.domain'};
     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
     if (keys(%author_roles) > 0) {
+        my $message;
+        my $reqdmajor = 2;
+        my $reqdminor = 12;
+        my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'});
+        my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
+        if (($major eq '' && $minor eq '') ||
+            ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor))) {
             my %ausettings=('environment.nocodemirror' => '');
             if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }
             &Apache::lonnet::put('environment',\%ausettings);
@@ -2117,16 +2213,138 @@
             } else {
                 $status=&mt('off');
             }
-            my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));
+            $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));
             $message=&Apache::loncommon::confirmwrapper($message);
-            if ($env{'form.returnurl'}) {
-                &do_redirect($r,$env{'form.returnurl'},$message);
-            } else {
-                &print_main_menu($r,$message);
+        } else {
+            my @items = ('nocodemirror','copyright','sourceavail');
+            my %oldsettings = &Apache::lonnet::get('environment',\@items);
+            my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
+            my %lt = &authoring_settings_text();
+            my %titles = &authoring_settings_titles();
+            my ($result,%newsettings,%changes, at delete, at unchanged, at delerrors, at adderrors);
+            foreach my $item (@items) {
+                if ($env{'form.'.$item} eq 'dom') {
+                    if ($oldsettings{$item} eq '') {
+                        push(@unchanged,$item);
+                    } else {
+                        push(@delete,$item);
+                    }
+                } elsif ($env{'form.'.$item} eq 'user') {
+                    my $newval = $env{'form.userchoice_'.$item};
+                    my @possibles;
+                    if ($item eq 'nocodemirror') {
+                        if ($newval =~ /^yes|no$/) {
+                            $newsettings{$item} = $newval;
+                        }
+                    } elsif ($item eq 'copyright') {
+                        @possibles = (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids));
+                        if (grep(/^\Q$newval\E$/, at possibles)) {
+                            $newsettings{$item} = $newval;
+                        }
+                    } elsif ($item eq 'sourceavail') {
+                        @possibles = (&Apache::loncommon::source_copyrightids);
+                        if (grep(/^\Q$newval\E$/, at possibles)) {
+                            $newsettings{$item} = $newval;
+                        }
+                    }
+                    if ($oldsettings{$item} eq $newsettings{$item}) {
+                        push(@unchanged,$item);
+                    } else {
+                        $changes{$item} = $newsettings{$item};
+                    }
+                }
+            }
+            if (@delete) {
+                if (&Apache::lonnet::del('environment',\@delete) eq 'ok') {
+                    foreach my $key (@delete) {
+                        &Apache::lonnet::delenv('environment.'.$key);
+                    }
+                } else {
+                    @delerrors = @delete;
+                }
+            }
+            if (keys(%changes)) {
+                if (&Apache::lonnet::put('environment',\%changes) eq 'ok') {
+                    my %newenvhash;
+                    map {$newenvhash{'environment.'.$_} = $changes{$_}; } (keys(%changes));
+                    &Apache::lonnet::appenv(\%newenvhash);
+                } else {
+                    foreach my $item (@items) {
+                        if (exists($changes{$item})) {
+                            push(@adderrors,$item);
+                        }
+                    }
+                }
             }
+            if (@adderrors) {
+                $result = &mt('An error occurred when saving user-specific settings for').': '.
+                          join(', ', map { $titles{$_} } @adderrors);
+                $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1));
+            } elsif (keys(%changes)) {
+                $result = &mt('User-specific settings saved:').'<ul>';
+                foreach my $item (@items) {
+                    next unless (exists($changes{$item}));
+                    my $value = $changes{$item};
+                    if ($item eq 'nocodemirror') {
+                        $value = $lt{$changes{$item}};
+                    } elsif ($item eq 'copyright') {
+                        $value = &Apache::loncommon::copyrightdescription($changes{$item});
+                    } elsif ($item eq 'sourceavail') {
+                        $value = &Apache::loncommon::source_copyrightdescription($changes{$item});
+                    }
+                    $result .= '<li>'.
+                               &mt('[_1] set to [_2]',
+                                   $titles{$item},
+                                   '<span style="font-style:italic">'.$value.'</span>').
+                               '</li>';
+                }
+                $result .= '</ul>';
+                $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));
+            }
+            if (@delerrors) {
+                $result = &mt('An error occurred when deleting user-specific settings for').':<ul><li>'.
+                          join('</li><li>', map { $titles{$_} } @delerrors).'</li></ul>';
+                $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1));
+            } elsif (@delete) {
+                $result = &mt('Set use of domain default for').':<ul><li>'.
+                          join('</li><li>', map { $titles{$_} } @delete).'</li></ul>';
+                $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));
+            }
+            if (@unchanged) {
+                $result = &mt('No changes made for').':<ul><li>'.
+                          join('</li><li>', map { $titles{$_} } @unchanged).'</li></ul>';
+                $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result));
+            }
+        }
+        if ($env{'form.returnurl'}) {
+            &do_redirect($r,$env{'form.returnurl'},$message);
+        } else {
+            &print_main_menu($r,$message);
+        }
     }
 }
 
+sub authoring_settings_text {
+    return &Apache::lonlocal::texthash(
+               'auss' => 'Authoring Space Settings',
+               'used' => 'Use domain default',
+               'usyo' => 'Use your own user-specific setting',
+               'curd' => 'Current domain default is',
+               'ousv' => 'Own user-specific value',
+               'save' => 'Save',
+               'yes'  => 'Deactivated',
+               'no'   => 'Activated',
+     );
+}
+
+sub authoring_settings_titles {
+    return &Apache::lonlocal::texthash(
+               'nocodemirror' => 'CodeMirror for EditXML editor',
+               'copyright'    => 'Default Copyright/Distribution in new metadata file',
+               'sourceavail'  => 'Default Source Available in new metadata file',
+    );
+}
+
 sub lockednameschanger {
     my $r = shift;
     my %userenv = &Apache::lonnet::get('environment',['lockedname']);
@@ -2223,39 +2441,9 @@
     my $uname = $env{'user.name'};
     my $udom = $env{'user.domain'};
     if (&Apache::lonnet::usertools_access($uname,$udom,'timezone')) {
-        my $js = <<"ENDSCRIPT";
-<script type-"text/javascript">
-// <![CDATA[
-function toggleTZdisplay(form) {
-    var radioname = 'settimezone';
-    var divid = 'LC_timezone_selector';
-    var num = form.elements[radioname].length;
-    if (num) {
-        var setvis = '';
-        for (var i=0; i<num; i++) {
-            if (form.elements[radioname][i].checked) {
-                if (form.elements[radioname][i].value == '1') {
-                    if (document.getElementById(divid)) {
-                        document.getElementById(divid).style.display = 'inline-block';
-                    }
-                    setvis = 1;
-                }
-                break;
-            }
-        }
-        if (!setvis) {
-            if (document.getElementById(divid)) {
-                document.getElementById(divid).style.display = 'none';
-            }
-        }
-    }
-    return;
-}
-// ]]>
-</script>
-ENDSCRIPT
+        my $js = &toggle_options_js();
         my %loaditems = (
-                           onload => 'javascript:toggleTZdisplay(document.prefs);',
+                           onload => "javascript:toggleOptions(document.prefs,'settimezone','LC_timezone_selector');",
                         );
         my $args = { 'add_entries' => \%loaditems };
         &Apache::lonhtmlcommon::add_breadcrumb(
@@ -2278,7 +2466,7 @@
             $checked{'lctz'} = ' checked="checked"';
             $tzsty = 'none';
         }
-        my $onclick = ' onclick="javascript:toggleTZdisplay(this.form);"';
+        my $onclick = ' onclick="javascript:toggleOptions(this.form,'."'settimezone','LC_timezone_selector'".');"';
         my $selector = &Apache::loncommon::select_timezone('timezone',$timezone,undef,1);
         $r->print(<<"END");
 <form name="prefs" action="/adm/preferences" method="post">
@@ -2349,6 +2537,8 @@
 if (&Apache::lonnet::usertools_access($user,$domain,'timezone')) {
     $permissions{'timezone'} = 'F';
 }
+my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
+my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
 my @menu=
     ({	categorytitle=>'Personal Data',
 	items =>[
@@ -2437,6 +2627,33 @@
 	    },
 		]
     },
+    );
+if (keys(%author_coauthor_roles) > 0) {
+    push(@menu,
+    {    categorytitle=>'Authoring Settings',
+         items => [
+             {
+                  linktext => 'Authoring Space Configuration',
+                  url => '/adm/preferences?action=authorsettings',
+                  permission => 'F',
+                  icon => 'codemirror.png',
+                  linktitle => 'Settings for your authoring space.',
+             },
+                  ]
+    },
+    );
+    if (keys(%author_roles) > 0) {
+        push(@{ $menu[4]->{items} }, {
+        linktext => 'Restrict Domain Coordinator Access',
+        url => '/adm/preferences?action=changedomcoord',
+        permission => 'F',
+        #help => '',
+        icon => 'system-lock-screen.png',
+        linktitle => 'Restrict domain coordinator access.',
+        });
+    }
+}
+push(@menu,
     {	categorytitle=>'Other',
 	items =>[
 	    {	linktext => 'Register Response Devices ("Clickers")',
@@ -2448,10 +2665,10 @@
 	    },
 		]
     },
-    );
+);
 
     if ($currentauth =~ /^(unix|internal):/) {
-push(@{ $menu[0]->{items} }, {
+        push(@{ $menu[0]->{items} }, {
 	linktext => 'Password',
 	url => '/adm/preferences?action=changepass',
 	permission => 'F',
@@ -2472,22 +2689,10 @@
         });
     }
 
-    my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
-    if (keys(%author_roles) > 0) {
-push(@{ $menu[4]->{items} }, {
-	linktext => 'Restrict Domain Coordinator Access',
-	url => '/adm/preferences?action=changedomcoord',
-	permission => 'F',
-	#help => '',
-	icon => 'system-lock-screen.png',
-	linktitle => 'Restrict domain coordinator access.',
-	});
-    }
-
     if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
 	|| &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
 				    .$env{'request.course.sec'})) {
-push(@{ $menu[4]->{items} }, {
+push(@{ $menu[-1]->{items} }, {
 	linktext => 'Course Initialization',
 	url => '/adm/preferences?action=changecourseinit',
 	permission => 'F',
@@ -2498,19 +2703,8 @@
 
     }
 
-    my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
-    if (keys(%author_coauthor_roles) > 0) {
-        push(@{ $menu[4]->{items} }, {
-            linktext => 'Authoring Space Configuration',
-            url => '/adm/preferences?action=authorsettings',
-            permission => 'F',
-            icon => 'codemirror.png',
-            linktitle => 'Settings for your authoring space.',
-        });
-    }
-
     if (&can_toggle_debug()) {
-push(@{ $menu[4]->{items} }, {
+push(@{ $menu[-1]->{items} }, {
 	linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'),
 	url => '/adm/preferences?action=debugtoggle',
 	permission => 'F',
@@ -2742,13 +2936,66 @@
 sub do_redirect {
     my ($r,$url,$msg) = @_;
     $r->print(
-        &Apache::loncommon::start_page('Switching Server ...',undef,
-                                       {'redirect'       => [0.5,$url]}).
+        &Apache::loncommon::start_page('Loading ...',undef,
+                                       {'redirect'       => [2,$url]}).
         '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
         "$msg\n".
         &Apache::loncommon::end_page());
     return;
 }
 
+sub toggle_options_js {
+    return <<"ENDSCRIPT";
+<script type="text/javascript">
+// <![CDATA[
+function toggleOptions(form,radioname,divid) {
+    var num = form.elements[radioname].length;
+    if (num) {
+        var setvis = '';
+        var onvalue = 'user';
+        if (radioname == 'settimezone') {
+            onvalue = '1';
+        }
+        for (var i=0; i<num; i++) {
+            if (form.elements[radioname][i].checked) {
+                if (form.elements[radioname][i].value == onvalue) {
+                    if (document.getElementById(divid)) {
+                        document.getElementById(divid).style.display = 'inline-block';
+                    }
+                    setvis = 1;
+                }
+                break;
+            }
+        }
+        if (!setvis) {
+            if (document.getElementById(divid)) {
+                document.getElementById(divid).style.display = 'none';
+            }
+        }
+    }
+    return;
+}
+// ]]>
+</script>
+ENDSCRIPT
+}
+
+sub selectbox {
+    my ($name,$value,$readonly,$functionref, at idlist)=@_;
+    my $selout = '<select name="'.$name.'">';
+    foreach my $id (@idlist) {
+        $selout.='<option value="'.$id.'"';
+        if ($id eq $value) {
+            $selout.=' selected="selected"';
+        }
+        if ($readonly) {
+            $selout .= ' disabled="disabled"';
+        }
+        $selout.='>'.&{$functionref}($id).'</option>';
+    }
+    $selout.='</select>';
+    return $selout;
+}
+
 1;
 __END__


More information about the LON-CAPA-cvs mailing list