--- loncom/interface/lonpreferences.pm 2014/02/15 17:59:33 1.212 +++ loncom/interface/lonpreferences.pm 2016/09/12 15:51:08 1.221 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.212 2014/02/15 17:59:33 raeburn Exp $ +# $Id: lonpreferences.pm,v 1.221 2016/09/12 15:51:08 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -160,11 +160,13 @@ sub texenginechanger { my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get('environment',['texengine']); my $texengine=$userenv{'texengine'}; + if (lc($texengine) eq 'jsmath') { + $texengine = 'MathJax'; + } my %mathchoices=('' => 'Default', 'tth' => 'tth (TeX to HTML)', #'ttm' => 'TeX to MathML', - 'jsMath' => 'jsMath', 'MathJax' => 'MathJax', 'mimetex' => 'mimetex (Convert to Images)', 'raw' => 'Raw (Screen Reader)' @@ -176,33 +178,17 @@ sub texenginechanger { 'texengine', \%mathchoices); my $MathJax_start=&Apache::lontexconvert::MathJax_header(); - my $jsMath_start=&Apache::lontexconvert::jsMath_header(); my %lt=&Apache::lonlocal::texthash( 'headline' => 'Change how math is displayed', 'preftxt' => 'Preferred method to display math', 'change' => 'Save', 'exmpl' => 'Examples', 'mathjax' => 'MathJax:', - 'jsmath' => 'jsMath:', + '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):', ); - my $jsMathWarning='

' - .'

' - .&mt("It looks like you don't have the TeX math fonts installed.") - .'
' - .'
' - .&mt('The jsMath example on this page may not look right without them. ' - .'The [_1]jsMath Home Page[_2] has information on how to download the ' - .'needed fonts. In the meantime, jsMath will do the best it can ' - .'with the fonts you have, but it may not be pretty and some equations ' - .'may not be rendered correctly.' - ,'' - ,'') - .'
' - .'

'; - $r->print(<$lt{'headline'}
@@ -219,37 +205,22 @@ $lt{'exmpl'}

$lt{'mathjax'}

- +

-MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation. -

- -

$lt{'jsmath'}

-

-$jsMath_start - - +$lt{'mathjaxinfo'}

$lt{'mimetex'}

- +

$lt{'tth'}

- +

ENDLSCREEN - if ($env{'environment.texengine'} ne 'jsMath') { - $r->print(''); - } } @@ -260,6 +231,9 @@ sub verify_and_change_texengine { # Screenname my $newtexengine = $env{'form.texengine'}; $newtexengine=~s/[^\-\w]//g; + if (lc($newtexengine) eq 'jsmath') { + $newtexengine = 'MathJax'; + } if ($newtexengine eq 'ttm') { &Apache::lonnet::appenv({'browser.mathml' => 1}); } else { @@ -712,16 +686,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); } @@ -788,7 +797,7 @@ sub lockwarning { my $textbottom=&mt('Changing roles or logging out may result in data corruption.'); my ($num,%which)=&Apache::lonnet::get_locks(); my $which=''; - foreach my $id (keys %which) { + foreach my $id (keys(%which)) { $which.='
  • '.$which{$id}.'
  • '; } my $change=&mt('Override'); @@ -1218,7 +1227,7 @@ sub verify_and_change_colors { ); my $message=''; - foreach my $item (keys %colortypes) { + foreach my $item (keys(%colortypes)) { my $color=$env{'form.'.$item}; if (!($color =~ /^#/)) { $color = '#' . $color; @@ -1261,6 +1270,12 @@ sub passwordchanger { $r->print(Apache::loncommon::start_page('Personal Data')); $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password')); } + my ($blocked,$blocktext) = + &Apache::loncommon::blocking_status('passwd'); + if ($blocked) { + $r->print('

    '.$blocktext.'

    '); + return; + } if ((!defined($caller)) || ($caller eq 'preferences')) { $user = $env{'user.name'}; $domain = $env{'user.domain'}; @@ -1367,21 +1382,18 @@ sub jscript_send { uextkey=this.document.client.elements.ukey_cpass.value; lextkey=this.document.client.elements.lkey_cpass.value; initkeys(); - - this.document.pserver.elements.currentpass.value - =crypted(this.document.client.elements.currentpass.value); - + this.document.pserver.elements.currentpass.value = + getCrypted(this.document.client.elements.currentpass.value); uextkey=this.document.client.elements.ukey_npass1.value; lextkey=this.document.client.elements.lkey_npass1.value; initkeys(); this.document.pserver.elements.newpass_1.value - =crypted(this.document.client.elements.newpass_1.value); - + =getCrypted(this.document.client.elements.newpass_1.value); uextkey=this.document.client.elements.ukey_npass2.value; lextkey=this.document.client.elements.lkey_npass2.value; initkeys(); this.document.pserver.elements.newpass_2.value - =crypted(this.document.client.elements.newpass_2.value); + =getCrypted(this.document.client.elements.newpass_2.value); |; if ($caller eq 'reset_by_email') { $output .= qq| @@ -1396,6 +1408,7 @@ sub jscript_send { $ output .= qq| this.document.pserver.submit(); } + |; } @@ -1412,16 +1425,28 @@ sub client_form { 'changepass' => 'Save', ); + my $mobileargs; + (undef,undef,undef,undef,undef,undef,my $clientmobile) = + &Apache::loncommon::decode_user_agent(); + if ($clientmobile) { + $mobileargs = 'autocapitalize="off" autocorrect="off" '; + } my $output = '' .&Apache::lonhtmlcommon::start_pick_box(); if ($caller eq 'reset_by_email') { + my $mobileargs; + (undef,undef,undef,undef,undef,undef,my $clientmobile) = + &Apache::loncommon::decode_user_agent(); + if ($clientmobile) { + $mobileargs = 'autocapitalize="off" autocorrect="off" '; + } $output .= &Apache::lonhtmlcommon::row_title( '') - .'' + .'' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( '') - .'' + .'' .'' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( @@ -1431,16 +1456,16 @@ sub client_form { } else { $output .= &Apache::lonhtmlcommon::row_title( '') - .'' + .'' .&Apache::lonhtmlcommon::row_closure(); } $output .= &Apache::lonhtmlcommon::row_title( '') - .'' + .'' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title( '') - .'' + .'' .&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box(); $output .= '

    ' @@ -1489,6 +1514,12 @@ sub server_form { sub verify_and_change_password { my ($r,$caller,$mailtoken) = @_; my ($user,$domain,$homeserver); + my ($blocked,$blocktext) = + &Apache::loncommon::blocking_status('passwd'); + if ($blocked) { + $r->print('

    '.$blocktext.'

    '); + return; + } if ($caller eq 'reset_by_email') { $user = $env{'form.uname'}; $domain = $env{'form.udom'}; @@ -1557,7 +1588,7 @@ ENDERROR return 1; } my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo); - # + # $currentpass = &Apache::loncommon::des_decrypt($ckey ,$currentpass); $newpass1 = &Apache::loncommon::des_decrypt($n1key,$newpass1); $newpass2 = &Apache::loncommon::des_decrypt($n2key,$newpass2); @@ -1875,6 +1906,58 @@ sub verify_and_change_coursepage { &print_main_menu($r,$message); } +sub author_space_settings { + my $r = shift; + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=authorsettings', + text => 'Authoring Space Settings'}); + my $user = $env{'user.name'}; + 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 $constchecked=''; + if ($env{'environment.nocodemirror'}) { + $constchecked=' checked="checked"'; + } + 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'); + $r->print(< + + $text
    +
    + + +ENDSCREEN + } +} + +sub change_authoring_settings { + my $r = shift; + my $user = $env{'user.name'}; + 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 %ausettings=('environment.nocodemirror' => ''); + if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; } + &Apache::lonnet::put('environment',\%ausettings); + &Apache::lonnet::appenv({'environment.nocodemirror' => $ausettings{'environment.nocodemirror'}}); + my $status=''; + if ($ausettings{'environment.nocodemirror'} eq 'yes') { + $status=&mt('on'); + } else { + $status=&mt('off'); + } + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.'')); + $message=&Apache::loncommon::confirmwrapper($message); + &print_main_menu($r,$message); + } +} + sub lockednameschanger { my $r = shift; &Apache::lonhtmlcommon::add_breadcrumb( @@ -2116,6 +2199,18 @@ push(@{ $menu[4]->{items} }, { }); } + + my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']); + if (keys(%author_roles) > 0) { + push(@{ $menu[4]->{items} }, { + linktext => 'Authoring Space Configuration', + url => '/adm/preferences?action=authorsettings', + permission => 'F', + icon => 'course_ini.png', + linktitle => 'Settings for your authoring space.', + }); + } + if (&can_toggle_debug()) { push(@{ $menu[4]->{items} }, { linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'), @@ -2171,7 +2266,7 @@ sub handler { }elsif($env{'form.action'} eq 'changepass'){ &passwordchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_pass'){ - &verify_and_change_password($r); + &verify_and_change_password($r,'preferences'); }elsif($env{'form.action'} eq 'changescreenname'){ &screennamechanger($r); }elsif($env{'form.action'} eq 'verify_and_change_screenname'){ @@ -2224,6 +2319,10 @@ sub handler { &coursedisplaychanger($r); }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){ &verify_and_change_coursepage($r); + }elsif($env{'form.action'} eq 'authorsettings'){ + &author_space_settings($r); + }elsif($env{'form.action'} eq 'change_authoring_settings'){ + &change_authoring_settings($r); }elsif($env{'form.action'} eq 'debugtoggle'){ if (&can_toggle_debug()) { &toggle_debug();