--- loncom/homework/structuretags.pm 2015/02/22 15:23:57 1.529 +++ loncom/homework/structuretags.pm 2015/09/14 13:45:19 1.539 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.529 2015/02/22 15:23:57 raeburn Exp $ +# $Id: structuretags.pm,v 1.539 2015/09/14 13:45:19 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -224,10 +224,55 @@ sub end_tex { } sub homework_js { + my ($postsubmit,$timeout); + if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) { + my $crstype; + if (&Apache::loncommon::course_type() eq 'Community') { + $crstype = 'community'; + } else { + if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) { + $crstype = 'official'; + } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) { + $crstype = 'textbook'; + } else { + $crstype = 'unofficial'; + } + } + $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'}; + if ($postsubmit eq '') { + my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); + $postsubmit = $domdefs{'postsubmit'}; + unless ($postsubmit eq 'off') { + $timeout = $domdefs{$crstype.'postsubtimeout'}; + } + } elsif ($postsubmit eq '0') { + $postsubmit = 'off'; + } elsif ($postsubmit eq '1') { + $postsubmit = 'on'; + $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'}; + if ($timeout eq '') { + my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); + $timeout = $domdefs{$crstype.'postsubtimeout'}; + } + } + if ($timeout eq '') { + $timeout = 60; + } + } else { + my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); + $postsubmit = $domdefs{'postsubmit'}; + unless ($postsubmit eq 'off') { + $timeout = 60; + } + } + my $jstimeout = 0; + if ($timeout) { + $jstimeout = 1000 * $timeout; + } return &Apache::loncommon::resize_textarea_js(). &Apache::loncommon::colorfuleditor_js(). &setmode_javascript(). - <<'JS'; + <<"JS"; '; } } @@ -676,8 +754,18 @@ sub problem_edit_action_button { sub problem_edit_buttons { my ($mode)=@_; +# Buttons that save + my $result = '
'; + if ($mode eq 'editxml') { + $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); + $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); + } else { + $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); + $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); + } + $result.="\n
\n"; # Buttons that do not save - my $result='
'. + $result .= '
'. &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); if ($mode eq 'editxml') { $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); @@ -688,223 +776,9 @@ sub problem_edit_buttons { $result.=&problem_edit_action_button('subundo','undo','u','Undo',1); } $result.="\n
"; -# Buttons that save - $result.='
'; - if ($mode eq 'editxml') { - $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); - $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); - } else { - $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); - $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); - } - $result.="\n
\n"; return $result; } -sub insert_menu_datastructure { - - my $template_menu = &template_dropdown_datastructure(); - my $responseblock_menu = &responseblock_dropdown_datastructure(); - my $conditional_scripting = &conditional_scripting_datastructure(); - my $misc = &misc_datastructure(); - - my @menu = ($template_menu, $responseblock_menu, $conditional_scripting, $misc); - return \@menu; - -} - -sub template_dropdown_datastructure { - # gathering the all templates and their path, title, category and help topic - my @templates = &Apache::lonhomework::get_template_list('problem'); - # template category => title - my %tmplthash = (); - # template title => path - my %tmpltcontent = (); - - foreach my $template (@templates){ - # put in hash if the template is not empty - unless ($template->[1] eq ''){ - push(@{$tmplthash{$template->[2]}}, $template->[1]); - push(@{$tmpltcontent{$template->[1]}},$template->[0]); - } - } - - my $catList = []; - foreach my $cat (sort keys %tmplthash) { - my $catItems = []; - foreach my $title (sort @{$tmplthash{$cat}}) { - my $path = $tmpltcontent{$title}->[0]; - my $code; - open(FH, "<$path"); - while(){ - $code.= $_ unless $_ =~ /()|(<\/problem>)/; - } - close(FH); - - if ($code ne '') { - my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code)) . '\')'; - my $currItem = [$href, $title, undef]; - push @{$catItems}, $currItem; - } - } - push @{$catList}, [$catItems, $cat, undef]; - } - - my $templDropdown = [$catList, &mt("Complete Problem Templates"), undef]; - return $templDropdown; -} - -sub responseblock_dropdown_datastructure { - - my $mathCat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef] - ], - &mt("Math"), - undef - ]; - - my $miscCat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_matchresponse())) . "\')", &mt("Match Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N Statement"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Optionresponse"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef] - ], - &mt("Misc"), - undef - ]; - - my $chemCat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Structure"), undef] - ], - &mt("Chemical"), - undef - ]; - - my $textCat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef] - ], - &mt("Text"), - undef - ]; - - my $cats = [[$mathCat, $miscCat, $chemCat, $textCat], &mt("Response Types"), undef]; - return $cats; -} - - -sub conditional_scripting_datastructure { -# TODO: corresponding routines should be used for the javascript:insertText parts -# instead of the placeholder routine default_xml_tag with the tags -# e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which -# returns the corresponding content for this case - -#TODO translated is currently temporarily here, another solution should be found where the -# needed string can be retrieved - - my $translatedTag = ' - - - -'; - - my $cat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Tag"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Block"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef] - ], - &mt("Contitional Scripting"), - undef - ]; - - return $cat; -} - -sub misc_datastructure { - - my $graphicalCat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef] - ], - "Graphical", - undef - ]; - - my $advancedCat = [ - [ - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef], - ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef] - ], - "advanced", - undef - ]; - - my $cats = [[$graphicalCat, $advancedCat], &mt("misc"), undef]; - return $cats; -} - -# helper routine for the datastructure building subroutines -sub default_xml_tag { - my ($tag) = @_; - return "\n<$tag>"; -} - - -sub helpmenu_datastructure { - - my $width = 500; - my $height = 600; - - my $helpers = [ - ['Problem_LON-CAPA_Functions', &mt('Script Functions')], - ['Greek_Symbols', &mt('Greek Symbols')], - ['Other_Symbols', &mt('Other Symbols')], - ['Authoring_Output_Tags', &mt('Output Tags')], - ['Authoring_Multilingual_Problems', - &mt('How to create problems in different languages')] - ]; - - my $help_structure = []; - - foreach my $count (0..(scalar(@{$helpers})-1)) { - my $filename = $helpers->[$count]->[0]; - my $title = $helpers->[$count]->[1]; - my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');"); - push @{$help_structure}, [$href, $title, undef]; - } - - return $help_structure; -} - -# we need substitution to not break javascript code -sub convert_for_js { - my $return = shift; - $return =~ s|script|ESCAPEDSCRIPT|g; - $return =~ s|\n|\\r\\n|g; - $return =~ s|'|\\'|g; - $return =~ s|'|\\'|g; - return $return; -} - sub problem_edit_header { my ($mode)=@_; my $return = ''. @@ -916,9 +790,7 @@ sub problem_edit_header { ''. &problem_edit_buttons(); - $return.='
-
' - .&Apache::lonxml::message_location(); + $return .= '' . &Apache::lonxml::message_location(); $return .= ' '; @@ -931,7 +803,8 @@ sub problem_edit_header { $(\'.LC_edit_actionbar\').scrollToFixed( { fixed: function(){ - $(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); + //$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); + $(this).find(\'.LC_edit_actionbar\'); } } ); @@ -1405,8 +1278,8 @@ sub store_aggregates { } else { $anoncounter{$symb."\0".$part} = 1; } - my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}}; - if ($needsrelease) { + my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}.':'}; + if ($needsrelease) { my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'}; if ($curr_required eq '') { &Apache::lonnet::update_released_required($needsrelease); @@ -1517,6 +1390,7 @@ sub init_problem_globals { @Apache::inputtags::importlist = (); @Apache::inputtags::previous=(); @Apache::inputtags::previous_version=(); + $Apache::inputtags::leniency=''; $Apache::structuretags::printanswer='No'; @Apache::structuretags::whileconds=(); @Apache::structuretags::whilebody=(); @@ -1532,6 +1406,7 @@ sub reset_problem_globals { undef(%Apache::lonhomework::history); undef(%Apache::lonhomework::results); undef($Apache::inputtags::part); + undef($Apache::inputtags::leniency); if ($type eq 'Task') { undef($Apache::inputtags::slot_name); } elsif ($type eq 'problem') { @@ -1643,7 +1518,8 @@ sub start_problem { $target eq 'tex') { if ($env{'form.markaccess'}) { my @interval=&Apache::lonnet::EXT("resource.0.interval"); - &Apache::lonnet::set_first_access($interval[1],$interval[0]); + my ($timelimit) = split(/_/,$interval[0]); + &Apache::lonnet::set_first_access($interval[1],$timelimit); } ($status,$accessmsg,$slot_name,$slot) = @@ -2735,6 +2611,7 @@ sub start_part { my $id= &Apache::lonxml::get_id($parstack,$safeeval); $Apache::inputtags::part=$id; push(@Apache::inputtags::partlist,$id); + $Apache::inputtags::leniency=''; @Apache::inputtags::response=(); @Apache::inputtags::previous=(); @Apache::inputtags::previous_version=(); @@ -2900,6 +2777,7 @@ sub end_part { } pop @Apache::inputtags::status; $Apache::inputtags::part=''; + $Apache::inputtags::leniency=''; $Apache::lonhomework::type = $Apache::lonhomework::default_type; return $result; }