--- loncom/interface/lonmodifycourse.pm 2014/03/31 02:31:05 1.72 +++ 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.72 2014/03/31 02:31:05 raeburn 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); @@ -839,7 +941,7 @@ sub modify_selfenrollconfig { $r->print('
    '."\n". &hidden_form_elements().'
    '); &Apache::loncreateuser::update_selfenroll_config($r,$env{'form.pickedcourse'}, - $cdom,$cnum,\%currsettings); + $cdom,$cnum,'domain',$type,\%currsettings); $r->print('
    '); return; } @@ -862,6 +964,7 @@ sub get_selfenroll_settings { selfenroll_end_access => $coursehash->{'internal.selfenroll_end_access'}, default_enrollment_start_date => $coursehash->{'default_enrollment_start_date'}, default_enrollment_end_date => $coursehash->{'default_enrollment_end_date'}, + uniquecode => $coursehash->{'internal.uniquecode'}, ); } return %currsettings; @@ -1542,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; } @@ -1722,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"; @@ -1741,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"; @@ -1762,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 {'onload' => "hide_searching();"}, + add_entries => {'onload' => "hide_searching(); courseSet(document.filterpicker.official, 'load');"}, }; } $r->print(&Apache::loncommon::start_page('View/Modify Course/Community Settings', @@ -1865,8 +2126,9 @@ sub hidden_form_elements { &Apache::lonhtmlcommon::echo_form_input(['gosearch','updater','coursecode', 'prevphase','numlocalcc','courseowner','login','coursequota','intarg', 'locarg','krbarg','krbver','counter','hidefromcat','usecategory', - 'threshold','defaultcredits','uploadquota','selfenrollmgrdc','selfenrollmgrcc', - 'action','state','currsec_st','sections','newsec'],['^selfenrollmgr_'])."\n". + 'threshold','postsubmit','postsubtimeout','defaultcredits','uploadquota', + 'selfenrollmgrdc','selfenrollmgrcc','action','state','currsec_st', + 'sections','newsec'],['^selfenrollmgr_'])."\n". ''; return $hidden_elements; } @@ -1970,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')", @@ -1979,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')",