--- loncom/interface/lonpreferences.pm 2022/09/19 19:49:26 1.196.4.28.2.1 +++ loncom/interface/lonpreferences.pm 2024/02/28 06:28:07 1.196.4.28.2.2 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.196.4.28.2.1 2022/09/19 19:49:26 raeburn Exp $ +# $Id: lonpreferences.pm,v 1.196.4.28.2.2 2024/02/28 06:28:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2043,9 +2043,98 @@ sub author_space_settings { 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,@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("

$lt{'auss'}



\n". + '
'."\n". + ''."\n". + ''."\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 = ''; + foreach my $choice ('yes','no') { + $userelem .= '   '; + } + $userelem .= ''; + } + if ($userenv{$item} ne '') { + $checkeduser = $checkeddom; + $checkeddom = ''; + $divsty = 'display:inline-block'; + } + $r->print(<<"END"); +

$titles{$item}

+

$lt{'curd'}: $domdefdisplay

+

+    +

+
+$lt{'ousv'} +$userelem +


+END + } + $r->print('
'. + ''. + '
'."\n"); + } else { my $constchecked=''; if ($env{'environment.nocodemirror'}) { $constchecked=' checked="checked"'; @@ -2053,7 +2142,6 @@ sub author_space_settings { 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(< @@ -2063,6 +2151,7 @@ sub author_space_settings { ENDSCREEN + } } } @@ -2072,6 +2161,8 @@ sub change_authoring_settings { 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; + if (0) { my %ausettings=('environment.nocodemirror' => ''); if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; } &Apache::lonnet::put('environment',\%ausettings); @@ -2082,16 +2173,138 @@ sub change_authoring_settings { } else { $status=&mt('off'); } - my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.'')); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.'')); $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,@delete,@unchanged,@delerrors,@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$/,@possibles)) { + $newsettings{$item} = $newval; + } + } elsif ($item eq 'sourceavail') { + @possibles = (&Apache::loncommon::source_copyrightids); + if (grep(/^\Q$newval\E$/,@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:').''; + $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); + } + if (@delerrors) { + $result = &mt('An error occurred when deleting user-specific settings for').':'; + $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1)); + } elsif (@delete) { + $result = &mt('Set use of domain default for').':'; + $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); + } + if (@unchanged) { + $result = &mt('No changes made for').':'; + $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']); @@ -2188,39 +2401,10 @@ sub timezonechanger { my $uname = $env{'user.name'}; my $udom = $env{'user.domain'}; if (&Apache::lonnet::usertools_access($uname,$udom,'timezone')) { + my $js = &toggle_options_js(); my $js = <<"ENDSCRIPT"; - -ENDSCRIPT 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( @@ -2243,7 +2427,7 @@ ENDSCRIPT $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");
@@ -2314,6 +2498,8 @@ if (&Apache::lonnet::usertools_access($u 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 =>[ @@ -2402,6 +2588,33 @@ my @menu= }, ] }, + ); +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")', @@ -2416,7 +2629,7 @@ my @menu= ); if ($currentauth =~ /^(unix|internal):/) { -push(@{ $menu[0]->{items} }, { + push(@{ $menu[0]->{items} }, { linktext => 'Password', url => '/adm/preferences?action=changepass', permission => 'F', @@ -2426,7 +2639,7 @@ push(@{ $menu[0]->{items} }, { }); } if ($env{'environment.remote'} eq 'off') { -push(@{ $menu[1]->{items} }, { + push(@{ $menu[1]->{items} }, { linktext => 'Launch Remote Control', url => '/adm/remote?url=/adm/preferences&action=launch', permission => 'F', @@ -2456,22 +2669,10 @@ push(@{ $menu[1]->{items} }, { }); } - 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', @@ -2482,19 +2683,8 @@ push(@{ $menu[4]->{items} }, { } - 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', @@ -2726,13 +2916,66 @@ sub updateable_userinfo { 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]}). '
'."\n". "$msg\n". &Apache::loncommon::end_page()); return; } +sub toggle_options_js { + return <<"ENDSCRIPT"; + +ENDSCRIPT +} + +sub selectbox { + my ($name,$value,$readonly,$functionref,@idlist)=@_; + my $selout = ''; + return $selout; +} + 1; __END__