--- loncom/interface/lonpreferences.pm 2024/03/02 16:09:04 1.196.4.28.2.5
+++ loncom/interface/lonpreferences.pm 2024/03/03 00:08:37 1.245
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Preferences
#
-# $Id: lonpreferences.pm,v 1.196.4.28.2.5 2024/03/02 16:09:04 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.245 2024/03/03 00:08:37 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -165,7 +165,7 @@ sub texenginechanger {
my %mathchoices=('' => 'Default',
'tth' => 'tth (TeX to HTML)',
#'ttm' => 'TeX to MathML',
- 'MathJax' => 'MathJax',
+ 'MathJax' => 'MathJax',
'mimetex' => 'mimetex (Convert to Images)',
'raw' => 'Raw (Screen Reader)'
);
@@ -182,7 +182,7 @@ sub texenginechanger {
'change' => 'Save',
'exmpl' => 'Examples',
'mathjax' => 'MathJax:',
- 'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.',
+ 'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.',
'tth' => 'tth (TeX to HTML):',
'mimetex' => 'mimetex (Convert to Images):',
);
@@ -280,7 +280,7 @@ sub rolesprefchanger {
my $hotlist_n=$userenv{'recentrolesn'};
my ($checkedon,$checkedoff);
if ($hotlist_flag) {
- $checkedon = 'checked="checked"';
+ $checkedon = 'checked="checked"';
} else {
$checkedoff = 'checked="checked"';
}
@@ -683,16 +683,51 @@ sub verify_and_change_clicker {
my $r = shift;
my $user = $env{'user.name'};
my $domain = $env{'user.domain'};
+ my $uhome = $env{'user.home'};
my $newclickers = $env{'form.clickers'};
+ my $message;
$newclickers=~s/[^\w\:\-]+/\,/gs;
$newclickers=~tr/a-z/A-Z/;
$newclickers=~s/[\:\-]+/\-/g;
$newclickers=~s/\,+/\,/g;
$newclickers=~s/^\,//;
$newclickers=~s/\,$//;
- &Apache::lonnet::put('environment',{'clickers' => $newclickers});
- &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
- my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));
+ my @oldclickers = split(/,/,$env{'environment.clickers'});
+ my @newclickers = split(/,/,$newclickers);
+ my %newuniq;
+ map { $newuniq{$_} = 1; } @newclickers;
+ @newclickers = sort(keys(%newuniq));
+ my @differences = &Apache::loncommon::compare_arrays(\@oldclickers,\@newclickers);
+ if (@differences) {
+ my $putres = &Apache::lonnet::put('environment',{'clickers' => $newclickers});
+ if ($putres eq 'ok') {
+ my @adds = ();
+ my @dels = ();
+ foreach my $item (@differences) {
+ if (grep(/^\Q$item\E$/,@newclickers)) {
+ push(@adds,$item);
+ } else {
+ push(@dels,$item);
+ }
+ }
+ if (@dels) {
+ my %delclicker;
+ map { $delclicker{$_} = $user; } @dels;
+ my $putresult = &Apache::lonnet::iddel($domain,\%delclicker,$uhome,'clickers');
+ }
+ if (@adds) {
+ my %addclicker;
+ map { $addclicker{$_} = $user; } @adds;
+ my $putresult = &Apache::lonnet::updateclickers($domain,'add',\%addclicker,$uhome,1);
+ }
+ &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
+ $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));
+ } else {
+ $message=&Apache::lonhtmlcommon::confirm_success(&mt('Error saving clicker ID').1);
+ }
+ } else {
+ $message=''.&mt('Clicker information unchanged').'';
+ }
$message=&Apache::loncommon::confirmwrapper($message);
&print_main_menu($r, $message);
}
@@ -1142,10 +1177,10 @@ sub colorschanger {
foreach my $item (sort(keys(%colortypes))) {
my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
$chtable.=&Apache::loncommon::start_data_table_row().
- '
'.$colortypes{$item}.' | | '.
- &Apache::loncommon::end_data_table_row()."\n";
+ ''.$colortypes{$item}.' | | '.
+ &Apache::loncommon::end_data_table_row()."\n";
}
my $end_data_table = &Apache::loncommon::end_data_table();
my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
@@ -1197,9 +1232,9 @@ sub verify_and_change_colors {
my $message='';
foreach my $item (keys(%colortypes)) {
my $color=$env{'form.'.$item};
- if (!($color =~ /^#/)) {
- $color = '#' . $color;
- }
+ if (!($color =~ /^#/)) {
+ $color = '#' . $color;
+ }
my $entry='color.'.$function.'.'.$item;
if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
&Apache::lonnet::put('environment',{$entry => $color});
@@ -1285,9 +1320,9 @@ sub passwordchanger {
} else {
$r->print(
''
- .&mt('Sorry, the URL generated when you requested reset of'
- .' your password contained incomplete information.')
- .'
'
+ .&mt('Sorry, the URL generated when you requested reset of'
+ .' your password contained incomplete information.')
+ .''
);
return;
}
@@ -1402,7 +1437,7 @@ sub jscript_send {
var posspass = this.document.client.elements.newpass_1.value;
if (min > 0) {
if (posspass.length < min) {
- errors.push("$js_lt{'short'}");
+ errors.push("$js_lt{'short'}");
}
}
if (currauth == 'internal:') {
@@ -1431,7 +1466,7 @@ sub jscript_send {
} else if (rules[i] == 'spec') {
var pattern = /^[!@#$%^&*()_+\\-=\\[\\]{};':"\\\|,.\\/?]/;
if (!posspass.match(pattern)) {
- errors.push("$js_lt{'spec'}");
+ errors.push("$js_lt{'spec'}");
}
}
}
@@ -1725,10 +1760,10 @@ ENDERROR
} else {
my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1);
if ($warning) {
- &passwordchanger($r,''.
- $warning.
- &mt('Please try again.').'',
- $caller,$mailtoken,$timelimit,$extrafields);
+ &passwordchanger($r,''.
+ $warning.
+ &mt('Please try again.').'',
+ $caller,$mailtoken,$timelimit,$extrafields);
if ($caller eq 'reset_by_email') {
return 'rules';
} else {
@@ -2046,7 +2081,11 @@ sub author_space_settings {
my ($showdomdefs,$js,$args,@items);
my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
if (&expanded_authoring_settings()) {
- @items = ('nocodemirror','copyright','sourceavail');
+ @items = ('nocodemirror');
+ if (&daxe_permitted(\%author_roles)) {
+ push(@items,'daxecollapse');
+ }
+ push(@items,('copyright','sourceavail'));
$showdomdefs = 1;
$js = &toggle_options_js();
my $onload;
@@ -2062,13 +2101,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='';
@@ -2171,7 +2230,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();
@@ -2187,7 +2250,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;
}
@@ -2242,6 +2305,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') {
@@ -2289,12 +2358,15 @@ 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',
);
@@ -2302,30 +2374,43 @@ sub authoring_settings_titles {
sub expanded_authoring_settings {
my $reqdmajor = 2;
- my $reqdminor = 11;
- my $reqddotnum = 4;
- my $reqddotlett= 'B';
- my $reqdreldate = '2024030109';
- my $reqletterfail;
+ my $reqdminor = 12;
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;
- }
- }
+ my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
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))) {
+ ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor))) {
return 1;
}
return;
}
+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 lockednameschanger {
my $r = shift;
my %userenv = &Apache::lonnet::get('environment',['lockedname']);
@@ -2646,7 +2731,7 @@ push(@menu,
},
]
},
- );
+);
if ($currentauth =~ /^(unix|internal):/) {
push(@{ $menu[0]->{items} }, {
@@ -2658,25 +2743,6 @@ push(@menu,
linktitle => 'Change your password.',
});
}
- if ($env{'environment.remote'} eq 'off') {
- push(@{ $menu[1]->{items} }, {
- linktext => 'Launch Remote Control',
- url => '/adm/remote?url=/adm/preferences&action=launch',
- permission => 'F',
- #help => '',
- icon => 'remotecontrol.png',
- linktitle => 'Launch the remote control for LON-CAPA.',
- });
- }else{
-push(@{ $menu[1]->{items} }, {
- linktext => 'Collapse Remote Control',
- url => '/adm/remote?url=/adm/preferences&action=collapse',
- permission => 'F',
- #help => '',
- icon => 'remotecontrol.png',
- linktitle => 'Collapse the remote control for LON-CAPA.',
- });
- }
if (&can_toggle_namelocking()) {
push(@{ $menu[0]->{items} }, {
@@ -2766,8 +2832,8 @@ sub handler {
text => $brtxt,
help => $brhelp,});
if(!exists $env{'form.action'}) {
- &print_main_menu($r);
- $ended = 1;
+ &print_main_menu($r);
+ $ended = 1;
}elsif($env{'form.action'} eq 'changepass'){
&passwordchanger($r);
}elsif($env{'form.action'} eq 'verify_and_change_pass'){