--- loncom/interface/lonmodifycourse.pm 2014/07/31 15:45:27 1.74 +++ loncom/interface/lonmodifycourse.pm 2015/06/09 21:22:56 1.78 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # handler for DC-only modifiable course settings # -# $Id: lonmodifycourse.pm,v 1.74 2014/07/31 15:45:27 musolffc Exp $ +# $Id: lonmodifycourse.pm,v 1.78 2015/06/09 21:22:56 damieng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -208,7 +208,7 @@ sub print_course_selection_page { my %courses = &Apache::loncommon::search_courses($dom,$type,$filter,$numtitles, undef,undef,undef,\@codetitles); &Apache::lonpickcourse::display_matched_courses($r,$type,0,$action,undef,undef,undef, - %courses); + undef,undef,%courses); return; } @@ -261,7 +261,8 @@ sub print_modification_menu { } $cat_text = 'View/Modify catalog settings for course'; } - my $anon_text = 'Responder threshold required to display anonymous survey submissions'; + my $anon_text = &mt('Responder threshold required to display anonymous survey submissions.'); + my $postsubmit_text = &mt('Override defaults for submit button behavior post-submission for this specific course.'); my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom); my @additional_params = &catalog_settable($domconf{'coursecategories'},$type); @@ -332,6 +333,14 @@ sub print_modification_menu { permission => &manage_selfenrollment($cdom,$cnum,$type,$coursehash), linktitle => 'Configure user self-enrollment.', }, + { + linktext => 'View/Modify submit button behavior, post-submission', + icon => 'emblem-readonly.png', + #help => '', + url => &phaseurl('setpostsubmit'), + permission => 1, + linktitle => '', + }, ] }, ); @@ -360,7 +369,8 @@ sub print_modification_menu { } $menu_html .= '
  • '.$setquota_text.'
  • '."\n". '
  • '.$setuploadquota_text.'
  • '."\n". - '
  • '.$anon_text.'
  • '."\n"; + '
  • '.$anon_text.'
  • '."\n". + '
  • '.$postsubmit_text.'
  • '."\n"; foreach my $item (@additional_params) { if ($type eq 'Community') { if ($item eq 'togglecats') { @@ -555,6 +565,98 @@ ENDDOCUMENT return; } +sub print_postsubmit_config { + my ($r,$cdom,$cnum,$cdesc,$type) = @_; + my %lt = &Apache::lonlocal::texthash ( + 'conf' => 'Configure submit button behavior after student makes a submission', + 'disa' => 'Disable submit button/keypress following student submission', + 'nums' => 'Number of seconds submit is disabled', + 'modi' => 'Save', + 'back' => 'Pick another action', + 'yes' => 'Yes', + 'no' => 'No', + ); + my %settings = &Apache::lonnet::get('environment',['internal.postsubmit','internal.postsubtimeout', + 'internal.coursecode','internal.textbook'],$cdom,$cnum); + my $postsubmit = $settings{'internal.postsubmit'}; + if ($postsubmit eq '') { + my %domconfig = + &Apache::lonnet::get_dom('configuration',['coursedefaults'],$cdom); + $postsubmit = 1; + if (ref($domconfig{'coursedefaults'}) eq 'HASH') { + if (ref($domconfig{'coursedefaults'}{'postsubmit'}) eq 'HASH') { + if ($domconfig{'coursedefaults'}{'postsubmit'}{'client'} eq 'off') { + $postsubmit = 0; + } + } + } + } + my ($checkedon,$checkedoff,$display); + if ($postsubmit) { + $checkedon = 'checked="checked"'; + $display = 'block'; + } else { + $checkedoff = 'checked="checked"'; + $display = 'none'; + } + my $postsubtimeout = $settings{'internal.postsubtimeout'}; + my $default = &domain_postsubtimeout($cdom,$type,\%settings); + my $zero = &mt('(Enter 0 to disable until next page reload, or leave blank to use the domain default: [_1])',$default); + if ($postsubtimeout eq '') { + $postsubtimeout = $default; + } + &print_header($r,$type); + my $hidden_elements = &hidden_form_elements(); + my $helpitem = &Apache::loncommon::help_open_topic('Modify_Postsubmit_Config'); + $r->print(< +

    $lt{'conf'} ($cdesc)

    +

    +$helpitem $lt{'disa'}: +   + +

    +$lt{'nums'}
    +$zero
    +
    + +

    +$hidden_elements +$lt{'back'} + +ENDDOCUMENT + return; +} + +sub domain_postsubtimeout { + my ($cdom,$type,$settings) = @_; + return unless (ref($settings) eq 'HASH'); + my $lctype = lc($type); + unless ($type eq 'Community') { + $lctype = 'unofficial'; + if ($settings->{'internal.coursecode'}) { + $lctype = 'official'; + } elsif ($settings->{'internal.textbook'}) { + $lctype = 'textbook'; + } + } + my %domconfig = + &Apache::lonnet::get_dom('configuration',['coursedefaults'],$cdom); + my $postsubtimeout = 60; + if (ref($domconfig{'coursedefaults'}) eq 'HASH') { + if (ref($domconfig{'coursedefaults'}{'postsubmit'}) eq 'HASH') { + if (ref($domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}) eq 'HASH') { + if ($domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}{$lctype} ne '') { + $postsubtimeout = $domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}{$lctype}; + } + } + } + } + return $postsubtimeout; +} + sub print_catsettings { my ($r,$cdom,$cnum,$cdesc,$type) = @_; &print_header($r,$type); @@ -1543,7 +1645,83 @@ sub modify_anonsurvey_threshold { } $r->print('

    '. ''. - &mt('Pick another action').''); + &mt('Pick another action').'

    '); + $r->print(&hidden_form_elements().''); + return; +} + +sub modify_postsubmit_config { + my ($r,$cdom,$cnum,$cdesc,$domdesc,$type) = @_; + &print_header($r,$type); + my %lt = &Apache::lonlocal::texthash( + subb => 'Submit button behavior after student makes a submission:', + unch => 'Post submission behavior of the Submit button is unchanged.', + erro => 'An error occurred when saving your proposed changes.', + inva => 'An invalid response was recorded.', + pick => 'Pick another action', + ); + $r->print('
    '."\n". + '

    '.$lt{'subb'}.' ('.$cdesc.')


    '); + my %oldsettings = + &Apache::lonnet::get('environment',['internal.postsubmit','internal.postsubtimeout','internal.coursecode','internal.textbook'],$cdom,$cnum); + my $postsubmit = $env{'form.postsubmit'}; + if ($postsubmit eq '1') { + my $postsubtimeout = $env{'form.postsubtimeout'}; + $postsubtimeout =~ s/[^\d\.]+//g; + if (($oldsettings{'internal.postsubmit'} eq $postsubmit) && ($oldsettings{'internal.postsubtimeout'} eq $postsubtimeout)) { + $r->print($lt{'unch'}); + } else { + my %cenv = ( + 'internal.postsubmit' => $postsubmit, + ); + if ($postsubtimeout eq '') { + my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom,$cnum); + if ($putreply eq 'ok') { + my $defaulttimeout = &domain_postsubtimeout($cdom,$type,\%oldsettings); + $r->print(&mt('The proposed duration for disabling the Submit button post-submission was blank, so the domain default of [quant,_1,second] will be used.',$defaulttimeout)); + if (exists($oldsettings{'internal.postsubtimeout'})) { + &Apache::lonnet::del('environment',['internal.postsubtimeout'],$cdom,$cnum); + } + } else { + $r->print($lt{'erro'}); + } + } else { + $cenv{'internal.postsubtimeout'} = $postsubtimeout; + my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom,$cnum); + if ($putreply eq 'ok') { + if ($postsubtimeout eq '0') { + $r->print(&mt('Submit button will be disabled after student submission until page is reloaded.')); + } else { + $r->print(&mt('Submit button will be disabled after student submission for [quant,_1,second].',$postsubtimeout)); + } + } else { + $r->print($lt{'erro'}); + } + } + } + } elsif ($postsubmit eq '0') { + if ($oldsettings{'internal.postsubmit'} eq $postsubmit) { + $r->print($lt{'unch'}); + } else { + if (exists($oldsettings{'internal.postsubtimeout'})) { + &Apache::lonnet::del('environment',['internal.postsubtimeout'],$cdom,$cnum); + } + my %cenv = ( + 'internal.postsubmit' => $postsubmit, + ); + my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom,$cnum); + if ($putreply eq 'ok') { + $r->print(&mt('Submit button will not be disabled after student submission')); + } else { + $r->print($lt{'erro'}); + } + } + } else { + $r->print($lt{'inva'}.' '.$lt{'unch'}); + } + $r->print('

    '. + ''. + &mt('Pick another action').'

    '); $r->print(&hidden_form_elements().'
    '); return; } @@ -1723,6 +1901,8 @@ function hide_searching() { } elsif ($phase eq 'setquota') { my $invalid = &mt('The quota you entered contained invalid characters.'); my $alert = &mt('You must enter a number'); + &js_escape(\$invalid); + &js_escape(\$alert); my $regexp = '/^\s*(\d+\.?\d*|\.\d+)\s*$/'; $js .= <<"ENDSCRIPT"; @@ -1742,6 +1922,8 @@ ENDSCRIPT } elsif ($phase eq 'setanon') { my $invalid = &mt('The responder threshold you entered is invalid.'); my $alert = &mt('You must enter a positive integer.'); + &js_escape(\$invalid); + &js_escape(\$alert); my $regexp = ' /^\s*\d+\s*$/'; $js .= <<"ENDSCRIPT"; @@ -1763,8 +1945,86 @@ function verify_anon_threshold() { } ENDSCRIPT + } elsif ($phase eq 'setpostsubmit') { + my $invalid = &mt('The choice entered for disabling the submit button is invalid.'); + my $invalidtimeout = &mt('The timeout you entered for disabling the submit button is invalid.'); + my $alert = &mt('Enter one of: a positive integer, 0 (for no timeout), or leave blank to use domain default'); + &js_escape(\$invalid); + &js_escape(\$invalidtimeout); + &js_escape(\$alert); + my $regexp = ' /^\s*\d+\s*$/'; + + $js .= <<"ENDSCRIPT"; + +function verify_postsubmit() { + var optionsElement = document.setpostsubmit.postsubmit; + var verified = ''; + if (optionsElement.length) { + var currval; + for (var i=0; i= 0) { + verified = 'ok'; + } else { + alert("$invalidtimeout\\n$alert"); + return false; + } + } else { + alert("$invalid\\n$alert"); + return false; + } + } + } else { + if (currval == 0) { + verified = 'ok'; + } else { + alert('$invalid'); + return false; + } + } + if (verified == 'ok') { + changePage(document.setpostsubmit,'processpostsubmit'); + return true; + } + } + return false; +} + +function togglePostsubmit(caller) { + var optionsElement = document.setpostsubmit.postsubmit; + if (document.getElementById(caller)) { + var divitem = document.getElementById(caller); + var optionsElement = document.setpostsubmit.postsubmit; + if (optionsElement.length) { + var currval; + for (var i=0; i'; return $hidden_elements; } @@ -1971,7 +2232,6 @@ sub handler { ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Threshold for anonymous submissions display"}); &print_set_anonsurvey_threshold($r,$cdom,$cnum,$cdesc,$type); - } elsif ($phase eq 'processthreshold') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'setanon')", @@ -1980,6 +2240,16 @@ sub handler { ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_anonsurvey_threshold($r,$cdom,$cnum,$cdesc,$domdesc,$type); + } elsif ($phase eq 'setpostsubmit') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Configure submit button behavior post-submission"}); + &print_postsubmit_config($r,$cdom,$cnum,$cdesc,$type); + } elsif ($phase eq 'processpostsubmit') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Result"}); + &modify_postsubmit_config($r,$cdom,$cnum,$cdesc,$domdesc,$type); } elsif ($phase eq 'viewparms') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'viewparms')", 500 Internal Server Error

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.