--- loncom/interface/lonpreferences.pm 2024/02/28 06:28:07 1.196.4.28.2.2
+++ loncom/interface/lonpreferences.pm 2024/03/03 01:57:35 1.196.4.28.2.6
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Preferences
#
-# $Id: lonpreferences.pm,v 1.196.4.28.2.2 2024/02/28 06:28:07 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.196.4.28.2.6 2024/03/03 01:57:35 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -2045,13 +2045,12 @@ sub author_space_settings {
if (keys(%author_roles) > 0) {
my ($showdomdefs,$js,$args,@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');
+ if (&expanded_authoring_settings()) {
+ @items = ('nocodemirror');
+ if (&daxe_permitted(\%author_roles)) {
+ push(@items,'daxecollapse');
+ }
+ push(@items,('copyright','sourceavail'));
$showdomdefs = 1;
$js = &toggle_options_js();
my $onload;
@@ -2067,13 +2066,15 @@ sub author_space_settings {
my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
my %staticdefaults = (
'nocodemirror' => '0',
+ 'daxecollapse' => '0',
'copyright' => 'default',
'sourceavail' => 'closed',
);
my %lt = &authoring_settings_text();
my %titles = &authoring_settings_titles();
- $r->print("
$lt{'auss'}
\n".
+ $r->print("$lt{'auss'}
".
''."\n");
} else {
my $constchecked='';
@@ -2162,7 +2181,7 @@ sub change_authoring_settings {
my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
if (keys(%author_roles) > 0) {
my $message;
- if (0) {
+ if (!&expanded_authoring_settings()) {
my %ausettings=('environment.nocodemirror' => '');
if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }
&Apache::lonnet::put('environment',\%ausettings);
@@ -2176,7 +2195,11 @@ sub change_authoring_settings {
$message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.''));
$message=&Apache::loncommon::confirmwrapper($message);
} else {
- my @items = ('nocodemirror','copyright','sourceavail');
+ my @items = ('nocodemirror');
+ if (&daxe_permitted(\%author_roles)) {
+ push(@items,'daxecollapse');
+ }
+ push(@items,('copyright','sourceavail'));
my %oldsettings = &Apache::lonnet::get('environment',\@items);
my %domdefs = &Apache::lonnet::get_domain_defaults($domain);
my %lt = &authoring_settings_text();
@@ -2192,7 +2215,7 @@ sub change_authoring_settings {
} elsif ($env{'form.'.$item} eq 'user') {
my $newval = $env{'form.userchoice_'.$item};
my @possibles;
- if ($item eq 'nocodemirror') {
+ if (($item eq 'nocodemirror') || ($item eq 'daxecollapse')) {
if ($newval =~ /^yes|no$/) {
$newsettings{$item} = $newval;
}
@@ -2247,6 +2270,12 @@ sub change_authoring_settings {
my $value = $changes{$item};
if ($item eq 'nocodemirror') {
$value = $lt{$changes{$item}};
+ } elsif ($item eq 'daxecollapse') {
+ if ($value eq 'yes') {
+ $value = $lt{'coll'};
+ } else {
+ $value = $lt{'expa'};
+ }
} elsif ($item eq 'copyright') {
$value = &Apache::loncommon::copyrightdescription($changes{$item});
} elsif ($item eq 'sourceavail') {
@@ -2294,17 +2323,73 @@ sub authoring_settings_text {
'save' => 'Save',
'yes' => 'Deactivated',
'no' => 'Activated',
+ 'expa' => 'Start Expanded',
+ 'coll' => 'Start Collapsed',
);
}
sub authoring_settings_titles {
return &Apache::lonlocal::texthash(
'nocodemirror' => 'CodeMirror for EditXML editor',
+ 'daxecollapse' => 'Daxe editor: collapsible standard LON-CAPA menus',
'copyright' => 'Default Copyright/Distribution in new metadata file',
'sourceavail' => 'Default Source Available in new metadata file',
);
}
+sub daxe_permitted {
+ my ($aurolesref) = @_;
+ my $hasdaxe;
+ if (ref($aurolesref) eq 'HASH') {
+ my %editors;
+ foreach my $key (keys(%{$aurolesref})) {
+ if ($key =~ /^:$LONCAPA::match_domain:au$/) {
+ if (exists($env{'environment.editors'})) {
+ if (grep(/^daxe$/,split(/,/,$env{'environment.editors'}))) {
+ $hasdaxe = 1;
+ last;
+ }
+ }
+ } else {
+ my ($auname,$audom) = ($key =~ /^($LONCAPA::match_username):($LONCAPA::match_domain):(ca|aa)$/);
+ if (exists($env{"environment.internal.editors./$audom/$auname"})) {
+ if (grep(/^daxe$/,split(/,/,$env{"environment.internal.editors./$audom/$auname"}))) {
+ $hasdaxe = 1;
+ last;
+ }
+ }
+ }
+ }
+ }
+ return $hasdaxe;
+}
+
+sub expanded_authoring_settings {
+ my $reqdmajor = 2;
+ my $reqdminor = 11;
+ my $reqddotnum = 4;
+ my $reqddotlett= 'B';
+ my $reqdreldate = '2024030109';
+ my $reqletterfail;
+ my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'});
+ my ($major,$minor,$dotrel,$reldate) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.([\w.]+)\-(\d+)\'?$/);
+ my ($dotnum,$dotlett) = split(/\./,$dotrel);
+ my %lettdig = &Apache::lonnet::letter_to_digits();
+ if ((exists($lettdig{$dotlett})) && (exists($lettdig{$reqddotlett}))) {
+ if ($lettdig{$reqddotlett} > $lettdig{$dotlett}) {
+ $reqletterfail = 1;
+ }
+ }
+ unless (($major eq '' && $minor eq '') ||
+ ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)) ||
+ (($reqdmajor == $major) && ($reqdminor == $minor) && ($reqddotnum > $dotnum)) ||
+ (($reqdmajor == $major) && ($reqdminor == $minor) && ($reqddotnum == $dotnum) && $reqletterfail) ||
+ (($reqdmajor == $major) && ($reqdminor == $minor) && ($reqddotnum == $dotnum) && ($reqdreldate > $reldate))) {
+ return 1;
+ }
+ return;
+}
+
sub lockednameschanger {
my $r = shift;
my %userenv = &Apache::lonnet::get('environment',['lockedname']);
@@ -2402,7 +2487,6 @@ sub timezonechanger {
my $udom = $env{'user.domain'};
if (&Apache::lonnet::usertools_access($uname,$udom,'timezone')) {
my $js = &toggle_options_js();
- my $js = <<"ENDSCRIPT";
my %loaditems = (
onload => "javascript:toggleOptions(document.prefs,'settimezone','LC_timezone_selector');",
);