--- loncom/interface/lonhelper.pm 2005/01/20 20:20:35 1.94 +++ loncom/interface/lonhelper.pm 2005/07/12 16:11:19 1.112 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.94 2005/01/20 20:20:35 albertel Exp $ +# $Id: lonhelper.pm,v 1.112 2005/07/12 16:11:19 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,10 +25,6 @@ # # http://www.lon-capa.org/ # -# (Page Handler -# -# (.helper handler -# =pod @@ -186,6 +182,7 @@ use Apache::Constants qw(:common); use Apache::File; use Apache::lonxml; use Apache::lonlocal; +use Apache::lonnet; # Register all the tags with the helper, so the helper can # push and pop them @@ -255,7 +252,7 @@ sub real_handler { my $r = shift; my $uri = shift; if (!defined($uri)) { $uri = $r->uri(); } - $ENV{'request.uri'} = $uri; + $env{'request.uri'} = $uri; my $filename = '/home/httpd/html' . $uri; my $fh = Apache::File->new($filename); my $file; @@ -263,7 +260,7 @@ sub real_handler { # Send header, don't cache this page - if ($ENV{'browser.mathml'}) { + if ($env{'browser.mathml'}) { &Apache::loncommon::content_type($r,'text/xml'); } else { &Apache::loncommon::content_type($r,'text/html'); @@ -278,7 +275,7 @@ sub real_handler { my $allowed = $helper->allowedCheck(); if (!$allowed) { - $ENV{'user.error.msg'} = $ENV{'request.uri'}.':'.$helper->{REQUIRED_PRIV}. + $env{'user.error.msg'} = $env{'request.uri'}.':'.$helper->{REQUIRED_PRIV}. ":0:0:Permission denied to access this helper."; return HTTP_NOT_ACCEPTABLE; } @@ -363,6 +360,7 @@ use HTML::Entities(); use Apache::loncommon; use Apache::File; use Apache::lonlocal; +use Apache::lonnet; sub new { my $proto = shift; @@ -374,16 +372,16 @@ sub new { # If there is a state from the previous form, use that. If there is no # state, use the start state parameter. - if (defined $ENV{"form.CURRENT_STATE"}) + if (defined $env{"form.CURRENT_STATE"}) { - $self->{STATE} = $ENV{"form.CURRENT_STATE"}; + $self->{STATE} = $env{"form.CURRENT_STATE"}; } else { $self->{STATE} = "START"; } - $self->{TOKEN} = $ENV{'form.TOKEN'}; + $self->{TOKEN} = $env{'form.TOKEN'}; # If a token was passed, we load that in. Otherwise, we need to create a # new storage file # Tried to use standard Tie'd hashes, but you can't seem to take a @@ -416,16 +414,16 @@ sub new { return undef; } # Must create the storage - $self->{TOKEN} = md5_hex($ENV{'user.name'} . $ENV{'user.domain'} . + $self->{TOKEN} = md5_hex($env{'user.name'} . $env{'user.domain'} . time() . rand()); $self->{FILENAME} = $Apache::lonnet::tmpdir . md5_hex($self->{TOKEN}); } # OK, we now have our persistent storage. - if (defined $ENV{"form.RETURN_PAGE"}) + if (defined $env{"form.RETURN_PAGE"}) { - $self->{RETURN_PAGE} = $ENV{"form.RETURN_PAGE"}; + $self->{RETURN_PAGE} = $env{"form.RETURN_PAGE"}; } else { @@ -486,11 +484,11 @@ sub declareVar { } my $envname = 'form.' . $var . '.forminput'; - if (defined($ENV{$envname})) { - if (ref($ENV{$envname})) { - $self->{VARS}->{$var} = join('|||', @{$ENV{$envname}}); + if (defined($env{$envname})) { + if (ref($env{$envname})) { + $self->{VARS}->{$var} = join('|||', @{$env{$envname}}); } else { - $self->{VARS}->{$var} = $ENV{$envname}; + $self->{VARS}->{$var} = $env{$envname}; } } } @@ -502,7 +500,7 @@ sub allowedCheck { return 1; } - return Apache::lonnet::allowed($self->{REQUIRED_PRIV}, $ENV{'request.course.id'}); + return Apache::lonnet::allowed($self->{REQUIRED_PRIV}, $env{'request.course.id'}); } sub changeState { @@ -524,7 +522,7 @@ sub process { # Phase 1: Post processing for state of previous screen (which is actually # the "current state" in terms of the helper variables), if it wasn't the # beginning state. - if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq &mt("Next ->")) { + if ($self->{STATE} ne "START" || $env{"form.SUBMIT"} eq &mt("Next ->")) { my $prevState = $self->{STATES}{$self->{STATE}}; $prevState->postprocess(); } @@ -575,6 +573,7 @@ sub display { } # Phase 4: Display. + my $html=&Apache::lonxml::xmlbegin(); my $stateTitle=&mt($state->title()); my $helperTitle = &mt($self->{TITLE}); my $bodytag = &Apache::loncommon::bodytag($helperTitle,'',''); @@ -584,9 +583,8 @@ sub display { my $loncapaHelper = &mt("LON-CAPA Helper:"); $result .= <<HEADER; -<html> +$html <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>$loncapaHelper: $helperTitle</title> </head> $bodytag @@ -1115,6 +1113,7 @@ no strict; @ISA = ("Apache::lonhelper::element"); use strict; use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::choices', @@ -1189,7 +1188,8 @@ sub render { if ($self->{'multichoice'}) { $result .= <<SCRIPT; -<script> +<script type="text/javascript"> +// <!-- function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; @@ -1198,6 +1198,7 @@ sub render { } } } +// --> </script> SCRIPT } @@ -1266,13 +1267,13 @@ BUTTONS my $id = &new_id(); $result .= "<tr>\n<td width='20'> </td>\n"; $result .= "<td valign='top'><input type='$type' name='$var.forminput'" - . "' value='" . + . " value='" . HTML::Entities::encode($choice->[1],"<>&\"'") . "'"; if ($checkedChoices{$choice->[1]}) { - $result .= " checked "; + $result .= " checked='checked' "; } - $result .= qq{id="$id"}; + $result .= qq{id="id$id"}; my $choiceLabel = $choice->[0]; if ($choice->[4]) { # if we need to evaluate this choice $choiceLabel = "sub { my $helper = shift; my $state = shift;" . @@ -1280,7 +1281,7 @@ BUTTONS $choiceLabel = eval($choiceLabel); $choiceLabel = &$choiceLabel($helper, $self); } - $result .= "/></td><td> ".qq{<label for="$id">}. + $result .= "/></td><td> ".qq{<label for="id$id">}. $choiceLabel. "</label></td></tr>\n"; } $result .= "</table>\n\n\n"; @@ -1293,7 +1294,7 @@ BUTTONS # given, switch to it sub postprocess { my $self = shift; - my $chosenValue = $ENV{'form.' . $self->{'variable'} . '.forminput'}; + my $chosenValue = $env{'form.' . $self->{'variable'} . '.forminput'}; if (!defined($chosenValue) && !$self->{'allowempty'}) { $self->{ERROR_MSG} = @@ -1347,6 +1348,7 @@ no strict; @ISA = ("Apache::lonhelper::element"); use strict; use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::dropdown', @@ -1427,7 +1429,7 @@ sub render { HTML::Entities::encode($choice->[1],"<>&\"'") . "'"; if ($checkedChoices{$choice->[1]}) { - $result .= " selected"; + $result .= " selected='selected' "; } my $choiceLabel = $choice->[0]; if ($choice->[4]) { # if we need to evaluate this choice @@ -1436,7 +1438,7 @@ sub render { $choiceLabel = eval($choiceLabel); $choiceLabel = &$choiceLabel($helper, $self); } - $result .= ">" . &mtn($choiceLabel) . "\n"; + $result .= ">" . &mtn($choiceLabel) . "</option>\n"; } $result .= "</select>\n"; @@ -1447,7 +1449,7 @@ sub render { # given, switch to it sub postprocess { my $self = shift; - my $chosenValue = $ENV{'form.' . $self->{'variable'} . '.forminput'}; + my $chosenValue = $env{'form.' . $self->{'variable'} . '.forminput'}; if (!defined($chosenValue) && !$self->{'allowempty'}) { $self->{ERROR_MSG} = "You must choose one or more choices to" . @@ -1506,7 +1508,7 @@ no strict; @ISA = ("Apache::lonhelper::element"); use strict; use Apache::lonlocal; # A localization nightmare - +use Apache::lonnet; use Time::localtime; BEGIN { @@ -1566,7 +1568,7 @@ sub render { $result .= "<select name='${var}month'>\n"; for ($i = 0; $i < 12; $i++) { if ($i == $date->mon) { - $result .= "<option value='$i' selected>"; + $result .= "<option value='$i' selected='selected'>"; } else { $result .= "<option value='$i'>"; } @@ -1578,7 +1580,7 @@ sub render { $result .= "<select name='${var}day'>\n"; for ($i = 1; $i < 32; $i++) { if ($i == $date->mday) { - $result .= '<option selected>'; + $result .= '<option selected="selected">'; } else { $result .= '<option>'; } @@ -1590,7 +1592,7 @@ sub render { $result .= "<select name='${var}year'>\n"; for ($i = 2000; $i < 2030; $i++) { # update this after 64-bit dates if ($date->year + 1900 == $i) { - $result .= "<option selected>"; + $result .= "<option selected='selected'>"; } else { $result .= "<option>"; } @@ -1605,21 +1607,21 @@ sub render { my $pm = &mt('p.m.'); # Build hour $result .= "<select name='${var}hour'>\n"; - $result .= "<option " . ($date->hour == 0 ? 'selected ':'') . + $result .= "<option " . ($date->hour == 0 ? 'selected="selected" ':'') . " value='0'>" . &mt('midnight') . "</option>\n"; for ($i = 1; $i < 12; $i++) { if ($date->hour == $i) { - $result .= "<option selected value='$i'>$i $am</option>\n"; + $result .= "<option selected='selected' value='$i'>$i $am</option>\n"; } else { $result .= "<option value='$i'>$i $am</option>\n"; } } - $result .= "<option " . ($date->hour == 12 ? 'selected ':'') . + $result .= "<option " . ($date->hour == 12 ? 'selected="selected" ':'') . " value='12'>" . &mt('noon') . "</option>\n"; for ($i = 13; $i < 24; $i++) { my $printedHour = $i - 12; if ($date->hour == $i) { - $result .= "<option selected value='$i'>$printedHour $pm</option>\n"; + $result .= "<option selected='selected' value='$i'>$printedHour $pm</option>\n"; } else { $result .= "<option value='$i'>$printedHour $pm</option>\n"; } @@ -1634,7 +1636,7 @@ sub render { $printedMinute = "0" . $printedMinute; } if ($date->min == $i) { - $result .= "<option selected>"; + $result .= "<option selected='selected'>"; } else { $result .= "<option>"; } @@ -1650,14 +1652,14 @@ sub render { sub postprocess { my $self = shift; my $var = $self->{'variable'}; - my $month = $ENV{'form.' . $var . 'month'}; - my $day = $ENV{'form.' . $var . 'day'}; - my $year = $ENV{'form.' . $var . 'year'}; + my $month = $env{'form.' . $var . 'month'}; + my $day = $env{'form.' . $var . 'day'}; + my $year = $env{'form.' . $var . 'year'}; my $min = 0; my $hour = 0; if ($self->{'hoursminutes'}) { - $min = $ENV{'form.' . $var . 'minute'}; - $hour = $ENV{'form.' . $var . 'hour'}; + $min = $env{'form.' . $var . 'minute'}; + $hour = $env{'form.' . $var . 'hour'}; } my $chosenDate; @@ -1715,7 +1717,9 @@ to false. The "suppressEmptySequences" a suppressEmptySequences argument to the render routine, which will cause folders that have all of their contained resources filtered out to also be filtered out. The 'addstatus' attribute, if true, will add the icon -and long status display columns to the display. +and long status display columns to the display. The 'addparts' +attribute will add in a part selector beside problems that have more +than 1 part. =head3 SUB-TAGS @@ -1755,6 +1759,7 @@ and long status display columns to the d no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::resource', @@ -1782,6 +1787,10 @@ sub start_resource { $paramHash->{'suppressEmptySequences'} = $token->[2]{'suppressEmptySequences'}; $paramHash->{'toponly'} = $token->[2]{'toponly'}; $paramHash->{'addstatus'} = $token->[2]{'addstatus'}; + $paramHash->{'addparts'} = $token->[2]{'addparts'}; + if ($paramHash->{'addparts'}) { + $helper->declareVar($paramHash->{'variable'}.'_part'); + } $paramHash->{'closeallpages'} = $token->[2]{'closeallpages'}; return ''; } @@ -1923,7 +1932,8 @@ sub render { if ($self->{'multichoice'}) { $result = <<SCRIPT; -<script> +<script type="text/javascript"> +// <!-- function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; @@ -1932,6 +1942,7 @@ sub render { } } } +// --> </script> SCRIPT my %lt=&Apache::lonlocal::texthash( @@ -1955,9 +1966,10 @@ BUTTONS my $filterFunc = $self->{FILTER_FUNC}; my $choiceFunc = $self->{CHOICE_FUNC}; my $valueFunc = $self->{VALUE_FUNC}; - my $multichoice = $self->{'multichoice'}; + my $multichoice = $self->{'multichoice'}; my $option_vars = $self->{OPTION_VARS}; my $option_texts = $self->{OPTION_TEXTS}; + my $addparts = $self->{'addparts'}; my $headings_done = 0; # Evaluate the map url as needed @@ -1970,6 +1982,7 @@ BUTTONS $mapUrl = $self->{MAP_URL}; } + # Create the composite function that renders the column on the nav map # have to admit any language that lets me do this can't be all bad # - Jeremy (Pythonista) ;-) @@ -1998,33 +2011,81 @@ BUTTONS return $result; } else { my $col = ""; + my $raw_name = &$valueFunc($resource); my $resource_name = - HTML::Entities::encode(&$valueFunc($resource),"<>&\"'"); + HTML::Entities::encode($raw_name,"<>&\"'"); if($option_vars) { foreach my $option_var (@$option_vars) { + my $var_value = "\|\|\|" . $helper->{VARS}->{$option_var} . + "\|\|\|"; + my $checked =""; + if($var_value =~ /\Q|||$raw_name|||\E/) { + $checked = "checked='checked'"; + } $col .= "<td align='center'><input type='checkbox' name ='$option_var". ".forminput' value='". - $resource_name . "' /> </td>"; + $resource_name . "' $checked /> </td>"; } } $col .= "<td align='center'><input type='$inputType' name='${var}.forminput' "; if (!$checked && !$multichoice) { - $col .= "checked "; + $col .= "checked='checked' "; $checked = 1; } if ($multichoice) { # all resources start checked; see bug 1174 - $col .= "checked "; + $col .= "checked='checked' "; $checked = 1; } $col .= "value='" . $resource_name . "' /></td>"; + return $result.$col; } }; + my $renderPartsFunc = sub { + my ($resource, $part, $params) = @_; + my $col= "<td>"; + my $id=$resource->{ID}; + my $resource_name = + &HTML::Entities::encode(&$valueFunc($resource),"<>&\"'"); + if ($addparts && (scalar(@{$resource->parts}) > 1)) { + $col .= "<select onclick=\"javascript:updateRadio(this.form,'${var}.forminput','$resource_name');updateHidden(this.form,'$id','${var}');\" name='part_$id.forminput'>\n"; + $col .= "<option value=\"$part\">All Parts</option>\n"; + foreach my $part (@{$resource->parts}) { + $col .= "<option value=\"$part\">Part: $part</option>\n"; + } + $col .= "</select>"; + } + $col .= "</td>"; + }; + $result.=(<<RADIO); +<script type="text/javascript"> +// <!-- + function updateRadio(form,name,value) { + var radiobutton=form[name]; + for (var i=0; i<radiobutton.length; i++) { + if (radiobutton[i].value == value) { + radiobutton[i].checked = true; + break; + } + } + } + function updateHidden(form,id,name) { + var select=form['part_'+id+'.forminput']; + var hidden=form[name+'_part.forminput']; + var which=select.selectedIndex; + hidden.value=select.options[which].value; + } +// --> +</script> +<input type="hidden" name="${var}_part.forminput" /> - $ENV{'form.condition'} = !$self->{'toponly'}; - my $cols = [$renderColFunc, Apache::lonnavmaps::resource()]; +RADIO + $env{'form.condition'} = !$self->{'toponly'}; + my $cols = [$renderColFunc]; + if ($self->{'addparts'}) { push(@$cols, $renderPartsFunc); } + push(@$cols, Apache::lonnavmaps::resource()); if ($self->{'addstatus'}) { push @$cols, (Apache::lonnavmaps::part_status_summary()); @@ -2101,7 +2162,7 @@ no strict; @ISA = ("Apache::lonhelper::element"); use strict; use Apache::lonlocal; - +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::student', @@ -2148,7 +2209,8 @@ sub render { if ($self->{'multichoice'}) { $result = <<SCRIPT; -<script> +<script type="text/javascript"> +// <!-- function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; @@ -2181,6 +2243,7 @@ sub render { } } } +// --> </script> SCRIPT @@ -2287,7 +2350,7 @@ BUTTONS $self->{'variable'} . '.forminput' . "'"; if (!$self->{'multichoice'} && !$checked) { - $result .= " checked "; + $result .= " checked='checked' "; $checked = 1; } $result .= @@ -2317,7 +2380,7 @@ BUTTONS sub postprocess { my $self = shift; - my $result = $ENV{'form.' . $self->{'variable'} . '.forminput'}; + my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; if (!$result) { $self->{ERROR_MSG} = &mt('You must choose at least one student to continue.'); @@ -2387,7 +2450,7 @@ no strict; @ISA = ("Apache::lonhelper::element"); use strict; use Apache::lonlocal; - +use Apache::lonnet; use Apache::lonpubdir; # for getTitleString BEGIN { @@ -2492,7 +2555,8 @@ sub render { if ($self->{'multichoice'}) { $result = <<SCRIPT; -<script> +<script type="text/javascript"> +// <!-- function checkall(value, checkName) { for (i=0; i<document.forms.helpform.elements.length; i++) { ele = document.forms.helpform.elements[i]; @@ -2510,6 +2574,7 @@ sub render { } } } +// --> </script> SCRIPT my %lt=&Apache::lonlocal::texthash( @@ -2539,19 +2604,21 @@ BUTTONS # If the subdirectory is in local CSTR space my $metadir; if ($subdir =~ m|/home/([^/]+)/public_html/(.*)|) { - my $user = $1; - my $domain = $Apache::lonnet::perlvar{'lonDefDomain'}; + my ($user,$domain)= + &Apache::loncacc::constructaccess($subdir, + $Apache::lonnet::perlvar{'lonDefDomain'}); $metadir='/res/'.$domain.'/'.$user.'/'.$2; @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, ''); } elsif ($subdir =~ m|^~([^/]+)/(.*)$|) { $subdir='/home/'.$1.'/public_html/'.$2; - my $user = $1; - my $domain = $Apache::lonnet::perlvar{'lonDefDomain'}; + my ($user,$domain)= + &Apache::loncacc::constructaccess($subdir, + $Apache::lonnet::perlvar{'lonDefDomain'}); $metadir='/res/'.$domain.'/'.$user.'/'.$2; @fileList = &Apache::lonnet::dirlist($subdir, $domain, $user, ''); } else { # local library server resource space - @fileList = &Apache::lonnet::dirlist($subdir, $ENV{'user.domain'}, $ENV{'user.name'}, ''); + @fileList = &Apache::lonnet::dirlist($subdir, $env{'user.domain'}, $env{'user.name'}, ''); } # Sort the fileList into order @@ -2613,7 +2680,7 @@ BUTTONS . ".forminput' ".qq{id="$id"}." value='" . HTML::Entities::encode($fileName,"<>&\"'"). "'"; if (!$self->{'multichoice'} && $choices == 0) { - $result .= ' checked'; + $result .= ' checked="checked"'; } $result .= "/></td><td bgcolor='$color'>". qq{<label for="$id">}. $file . "</label></td>" . @@ -2644,9 +2711,9 @@ sub fileState { my $constructionSpaceDir = shift; my $file = shift; - my ($uname,$udom)=($ENV{'user.name'},$ENV{'user.domain'}); - if ($ENV{'request.role'}=~/^ca\./) { - (undef,$udom,$uname)=split(/\//,$ENV{'request.role'}); + my ($uname,$udom)=($env{'user.name'},$env{'user.domain'}); + if ($env{'request.role'}=~/^ca\./) { + (undef,$udom,$uname)=split(/\//,$env{'request.role'}); } my $docroot = $Apache::lonnet::perlvar{'lonDocRoot'}; my $subdirpart = $constructionSpaceDir; @@ -2671,7 +2738,7 @@ sub fileState { sub postprocess { my $self = shift; - my $result = $ENV{'form.' . $self->{'variable'} . '.forminput'}; + my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; if (!$result) { $self->{ERROR_MSG} = 'You must choose at least one file '. 'to continue.'; @@ -2824,7 +2891,7 @@ sub render { my $result = ''; if (defined $self->{ERROR_MSG}) { - $result .= '<br /><font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />'; + $result .= '<p><font color="#FF0000">' . $self->{ERROR_MSG} . '</font></p>'; } $result .= '<input type="string" name="' . $self->{'variable'} . '.forminput"'; @@ -2878,7 +2945,7 @@ package Apache::lonhelper::general; =head2 General-purpose tag: <exec>X<exec, helper tag> The contents of the exec tag are executed as Perl code, B<not> inside a -safe space, so the full range of $ENV and such is available. The code +safe space, so the full range of $env and such is available. The code will be executed as a subroutine wrapped with the following code: "sub { my $helper = shift; my $state = shift;" and @@ -2900,6 +2967,7 @@ be able to call methods on it. =cut use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::general', @@ -3031,6 +3099,7 @@ no strict; @ISA = ("Apache::lonhelper::element"); use strict; use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::final', ('final', 'exitpage')); @@ -3126,14 +3195,14 @@ sub render { my $targetURL = ''; my $finish=&mt('Finish'); if ($self->{'restartCourse'}) { - my $actionURL = '/adm/roles'; + $actionURL = '/adm/roles'; $targetURL = '/adm/menu'; - if ($ENV{'course.'.$ENV{'request.course.id'}.'.url'}=~/^uploaded/) { + if ($env{'course.'.$env{'request.course.id'}.'.url'}=~/^uploaded/) { $targetURL = '/adm/coursedocs'; } else { $targetURL = '/adm/navmaps'; } - if ($ENV{'course.'.$ENV{'request.course.id'}.'.clonedfrom'}) { + if ($env{'course.'.$env{'request.course.id'}.'.clonedfrom'}) { $targetURL = '/adm/parmset?overview=1'; } my $finish=&mt('Finish Course Initialization'); @@ -3145,7 +3214,7 @@ sub render { "<input type='button' onclick='history.go(-1)' value='$previous' />" . "<input type='hidden' name='orgurl' value='$targetURL' />" . "<input type='hidden' name='selectrole' value='1' />\n" . - "<input type='hidden' name='" . $ENV{'request.role'} . + "<input type='hidden' name='" . $env{'request.role'} . "' value='1' />\n<input type='submit' value='" . $finish . "' />\n" . "</form></center>"; @@ -3169,6 +3238,7 @@ no strict; @ISA = ('Apache::lonhelper::element'); use strict; use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonhelper::register('Apache::lonhelper::parmwizfinal', @@ -3210,6 +3280,11 @@ sub render { 'answer_date' => "0_answerdate", 'tries' => '0_maxtries', 'weight' => '0_weight' ); + my %realParmName = ('open_date' => "opendate", + 'due_date' => "duedate", + 'answer_date' => "answerdate", + 'tries' => 'maxtries', + 'weight' => 'weight' ); my $affectedResourceId = ""; my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}}; @@ -3217,11 +3292,17 @@ sub render { my $resourceString; my $symb; my $paramlevel; - + # Print the granularity, depending on the action if ($vars->{GRANULARITY} eq 'whole_course') { $resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>'; - $level = 9; # general course, see lonparmset.pm perldoc + if ($vars->{TARGETS} eq 'course') { + $level = 11; # general course, see lonparmset.pm perldoc + } elsif ($vars->{TARGETS} eq 'section') { + $level = 6; + } else { + $level = 3; + } $affectedResourceId = "0.0"; $symb = 'a'; $paramlevel = 'general'; @@ -3231,21 +3312,51 @@ sub render { my $title = $res->compTitle(); $symb = $res->symb(); $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>'; - $level = 8; + if ($vars->{TARGETS} eq 'course') { + $level = 10; # general course, see lonparmset.pm perldoc + } elsif ($vars->{TARGETS} eq 'section') { + $level = 5; + } else { + $level = 2; + } $affectedResourceId = $vars->{RESOURCE_ID}; $paramlevel = 'map'; } else { my $navmap = Apache::lonnavmaps::navmap->new(); my $res = $navmap->getById($vars->{RESOURCE_ID}); + my $part = $vars->{RESOURCE_ID_part}; + if ($part ne 'All Parts' && $part) { $parm_name=~s/^0/$part/; } else { $part=&mt('All Parts'); } $symb = $res->symb(); my $title = $res->compTitle(); - $resourceString .= '<li>'.&mt('for the resource named [_1]',"<b>$title</b>").'</li>'; - $level = 7; + $resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>'; + if ($vars->{TARGETS} eq 'course') { + $level = 7; # general course, see lonparmset.pm perldoc + } elsif ($vars->{TARGETS} eq 'section') { + $level = 4; + } else { + $level = 1; + } $affectedResourceId = $vars->{RESOURCE_ID}; $paramlevel = 'full'; } - my $result = "<form name='helpform' method='get' action='/adm/parmset#$affectedResourceId&$parm_name&$level'>\n"; + my $result = "<form name='helpform' method='POST' action='/adm/parmset#$affectedResourceId&$parm_name&$level'>\n"; + $result .= "<input type='hidden' name='action' value='settable' />\n"; + $result .= "<input type='hidden' name='dis' value='helper' />\n"; + $result .= "<input type='hidden' name='pscat' value='". + $realParmName{$vars->{ACTION_TYPE}}."' />\n"; + if ($vars->{GRANULARITY} eq 'resource') { + $result .= "<input type='hidden' name='symb' value='". + HTML::Entities::encode($symb,"'<>&\"") . "' />\n"; + } elsif ($vars->{GRANULARITY} eq 'map') { + $result .= "<input type='hidden' name='pschp' value='". + $affectedResourceId."' />\n"; + } + my $part = $vars->{RESOURCE_ID_part}; + if ($part eq 'All Parts' || !$part) { $part=0; } + $result .= "<input type='hidden' name='psprt' value='". + HTML::Entities::encode($part,"'<>&\"") . "' />\n"; + $result .= '<p>'.&mt('Confirm that this information is correct, then click "Finish Helper" to complete setting the parameter.').'<ul>'; # Print the type of manipulation: @@ -3283,6 +3394,8 @@ sub render { } elsif ($vars->{ACTION_TYPE} eq 'tries') { $result .= "<input type='hidden' name='pres_value' " . "value='" . $vars->{TRIES} . "' />\n"; + $result .= "<input type='hidden' name='pres_type' " . + "value='int_pos' />\n"; } elsif ($vars->{ACTION_TYPE} eq 'weight') { $result .= "<input type='hidden' name='pres_value' " . "value='" . $vars->{WEIGHT} . "' />\n"; @@ -3296,19 +3409,14 @@ sub render { } elsif ($vars->{TARGETS} eq 'section') { my $section = $vars->{SECTION_NAME}; $result .= '<li>'.&mt('for section [_1]',"<b>$section</b>").'</li>'; - $level -= 3; - $result .= "<input type='hidden' name='csec' value='" . + $result .= "<input type='hidden' name='csec' value='" . HTML::Entities::encode($section,"'<>&\"") . "' />\n"; } else { # FIXME: This is probably wasteful! Store the name! my $classlist = Apache::loncoursedata::get_classlist(); - my $username = $vars->{USER_NAME}; - # Chop off everything after the last colon (section) - $username = substr($username, 0, rindex($username, ':')); - my $name = $classlist->{$username}->[6]; + my ($uname,$udom)=split(':',$vars->{USER_NAME}); + my $name = $classlist->{$uname.':'.$udom}->[6]; $result .= '<li>'.&mt('for [_1]',"<b>$name</b>").'</li>'; - $level -= 6; - my ($uname, $udom) = split /:/, $vars->{USER_NAME}; $result .= "<input type='hidden' name='uname' value='". HTML::Entities::encode($uname,"'<>&\"") . "' />\n"; $result .= "<input type='hidden' name='udom' value='". @@ -3326,7 +3434,6 @@ sub render { # Make the table appear $result .= "\n<input type='hidden' value='true' name='prevvisit' />"; - $result .= "\n<input type='hidden' value='all' name='pschp' />"; $result .= "\n<input type='hidden' value='$symb' name='pssymb' />"; $result .= "\n<input type='hidden' value='$paramlevel' name='parmlev' />";