--- loncom/interface/lonhelper.pm 2004/04/27 15:32:45 1.77 +++ loncom/interface/lonhelper.pm 2005/01/16 08:20:38 1.93 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.77 2004/04/27 15:32:45 sakharuk Exp $ +# $Id: lonhelper.pm,v 1.93 2005/01/16 08:20:38 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1174,6 +1174,13 @@ sub end_choice { return ''; } +{ + # used to generate unique id attributes for <input> tags. + # internal use only. + my $id = 0; + sub new_id { return $id++; } +} + sub render { my $self = shift; my $var = $self->{'variable'}; @@ -1256,14 +1263,16 @@ BUTTONS my $type = "radio"; if ($self->{'multichoice'}) { $type = 'checkbox'; } foreach my $choice (@{$self->{CHOICES}}) { + my $id = &new_id(); $result .= "<tr>\n<td width='20'> </td>\n"; $result .= "<td valign='top'><input type='$type' name='$var.forminput'" . "' value='" . - HTML::Entities::encode($choice->[1],'<>&"') + HTML::Entities::encode($choice->[1],"<>&\"'") . "'"; if ($checkedChoices{$choice->[1]}) { $result .= " checked "; } + $result .= qq{id="$id"}; my $choiceLabel = $choice->[0]; if ($choice->[4]) { # if we need to evaluate this choice $choiceLabel = "sub { my $helper = shift; my $state = shift;" . @@ -1271,8 +1280,8 @@ BUTTONS $choiceLabel = eval($choiceLabel); $choiceLabel = &$choiceLabel($helper, $self); } - &Apache::lonnet::logthis("TITLE TRANSLATION >$choiceLabel<"); - $result .= "/></td><td> " . &mtn($choiceLabel) . "</td></tr>\n"; + $result .= "/></td><td> ".qq{<label for="$id">}. + &mtn($choiceLabel). "</label></td></tr>\n"; } $result .= "</table>\n\n\n"; $result .= $buttons; @@ -1415,7 +1424,7 @@ sub render { $result .= "<select name='${var}.forminput'>\n"; foreach my $choice (@{$self->{CHOICES}}) { $result .= "<option value='" . - HTML::Entities::encode($choice->[1],'<>&"') + HTML::Entities::encode($choice->[1],"<>&\"'") . "'"; if ($checkedChoices{$choice->[1]}) { $result .= " selected"; @@ -1751,7 +1760,7 @@ BEGIN { &Apache::lonhelper::register('Apache::lonhelper::resource', ('resource', 'filterfunc', 'choicefunc', 'valuefunc', - 'mapurl')); + 'mapurl','option')); } sub new { @@ -1856,6 +1865,42 @@ sub start_mapurl { sub end_mapurl { return ''; } + +sub start_option { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + if (!defined($paramHash->{OPTION_TEXTS})) { + $paramHash->{OPTION_TEXTS} = [ ]; + $paramHash->{OPTION_VARS} = [ ]; + + } + # OPTION_TEXTS is a list of the text attribute + # values used to create column headings. + # OPTION_VARS is a list of the variable names, used to create the checkbox + # inputs. + # We're ok with empty elements. as place holders + # Although the 'variable' element should really exist. + # + + my $option_texts = $paramHash->{OPTION_TEXTS}; + my $option_vars = $paramHash->{OPTION_VARS}; + push(@$option_texts, $token->[2]{'text'}); + push(@$option_vars, $token->[2]{'variable'}); + + # Need to create and declare the option variables as well to make them + # persistent. + # + my $varname = $token->[2]{'variable'}; + $helper->declareVar($varname); + + + return ''; +} + +sub end_option { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + return ''; +} + # A note, in case I don't get to this before I leave. # If someone complains about the "Back" button returning them # to the previous folder state, instead of returning them to @@ -1907,10 +1952,13 @@ BUTTONS $result .= $buttons; - my $filterFunc = $self->{FILTER_FUNC}; - my $choiceFunc = $self->{CHOICE_FUNC}; - my $valueFunc = $self->{VALUE_FUNC}; - my $multichoice = $self->{'multichoice'}; + my $filterFunc = $self->{FILTER_FUNC}; + my $choiceFunc = $self->{CHOICE_FUNC}; + my $valueFunc = $self->{VALUE_FUNC}; + my $multichoice = $self->{'multichoice'}; + my $option_vars = $self->{OPTION_VARS}; + my $option_texts = $self->{OPTION_TEXTS}; + my $headings_done = 0; # Evaluate the map url as needed my $mapUrl; @@ -1928,15 +1976,40 @@ BUTTONS my $checked = 0; my $renderColFunc = sub { my ($resource, $part, $params) = @_; + my $result = ""; + + if(!$headings_done) { + if ($option_texts) { + foreach my $text (@$option_texts) { + $result .= "<th>$text</th>"; + } + } + $result .= "<th>Select</th>"; + $result .= "</tr><tr>"; # Close off the extra row and start a new one. + $headings_done = 1; + } my $inputType; if ($multichoice) { $inputType = 'checkbox'; } else {$inputType = 'radio'; } if (!&$choiceFunc($resource)) { - return '<td> </td>'; + $result .= '<td> </td>'; + return $result; } else { - my $col = "<td><input type='$inputType' name='${var}.forminput' "; + my $col = ""; + my $resource_name = + HTML::Entities::encode(&$valueFunc($resource),"<>&\"'"); + if($option_vars) { + foreach my $option_var (@$option_vars) { + $col .= + "<td align='center'><input type='checkbox' name ='$option_var". + ".forminput' value='". + $resource_name . "' /> </td>"; + } + } + + $col .= "<td align='center'><input type='$inputType' name='${var}.forminput' "; if (!$checked && !$multichoice) { $col .= "checked "; $checked = 1; @@ -1945,10 +2018,8 @@ BUTTONS $col .= "checked "; $checked = 1; } - $col .= "value='" . - HTML::Entities::encode(&$valueFunc($resource),'<>&"') - . "' /></td>"; - return $col; + $col .= "value='" . $resource_name . "' /></td>"; + return $result.$col; } }; @@ -2053,7 +2124,7 @@ sub start_student { $helper->declareVar($paramHash->{'variable'}); $paramHash->{'multichoice'} = $token->[2]{'multichoice'}; $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'}; - $paramHash->{'sctiveonly'} = $token->[2]{'activeonly'}; + $paramHash->{'activeonly'} = $token->[2]{'activeonly'}; if (defined($token->[2]{'nextstate'})) { $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'}; } @@ -2090,7 +2161,9 @@ sub render { for (i=0; i<document.forms.helpform.elements.length; i++) { comp = document.forms.helpform.elements.chksec.value; if (document.forms.helpform.elements[i].value.indexOf(':'+comp+':') != -1) { - document.forms.helpform.elements[i].checked=value; + if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) { + document.forms.helpform.elements[i].checked=value; + } } } } @@ -2098,7 +2171,14 @@ sub render { for (i=0; i<document.forms.helpform.elements.length; i++) { if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) { document.forms.helpform.elements[i].checked=true; - } + } + } + } + function uncheckexpired() { + for (i=0; i<document.forms.helpform.elements.length; i++) { + if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) { + document.forms.helpform.elements[i].checked=false; + } } } </script> @@ -2106,19 +2186,33 @@ SCRIPT my %lt=&Apache::lonlocal::texthash( 'ocs' => "Select Only Current Students", + 'ues' => "Unselect Expired Students", 'sas' => "Select All Students", 'uas' => "Unselect All Students", - 'sfsg' => "Select for Section/Group", + 'sfsg' => "Select Current Students for Section/Group", 'ufsg' => "Unselect for Section/Group"); $buttons = <<BUTTONS; <br /> -<input type="button" onclick="checkactive()" value="$lt{'ocs'}" /> -<input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" /> -<input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" /> -<input type="button" onclick="checksec(true)" value="$lt{'sfsg'}"> -<input type="text" size="5" name="chksec"> -<input type="button" onclick="checksec(false)" value="$lt{'ufsg'}"> +<table> + <tr> + + <td><input type="button" onclick="checkactive()" value="$lt{'ocs'}" /></td> + <td><input type="button" onclick="uncheckexpired()" value="$lt{'ues'}" /><br /></td> + </tr> + <tr> + <td><input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" /></td> + <td> <input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" /><br /></td> + </tr> + <tr> + <td><input type="button" onclick="checksec(true)" value="$lt{'sfsg'}"></td> + <td><input type="text" size="5" name="chksec"> </td> + </tr> + <tr> + <td><input type="button" onclick="checksec(false)" value="$lt{'ufsg'}"></td> + <td></td> + </tr> +</table> <br /> BUTTONS } @@ -2178,7 +2272,6 @@ BUTTONS } my $name = $self->{'coursepersonnel'} ? &mt('Name') : &mt('Student Name'); - &Apache::lonnet::logthis("THE NAME IS >$name<"); my $type = 'radio'; if ($self->{'multichoice'}) { $type = 'checkbox'; } $result .= "<table cellspacing='2' cellpadding='2' border='0'>\n"; @@ -2198,7 +2291,10 @@ BUTTONS $checked = 1; } $result .= - " value='" . HTML::Entities::encode($choice->[0] . ':' . $choice->[2] . ':' . $choice->[1] . ':' . $choice->[3],'<>&"') + " value='" . HTML::Entities::encode($choice->[0] . ':' + .$choice->[2] . ':' + .$choice->[1] . ':' + .$choice->[3], "<>&\"'") . "' /></td><td>" . HTML::Entities::encode($choice->[1],'<>&"') . "</td><td align='center'>" @@ -2366,6 +2462,13 @@ sub start_filefilter { sub end_filefilter { return ''; } +{ + # used to generate unique id attributes for <input> tags. + # internal use only. + my $id=0; + sub new_id { return $id++;} +} + sub render { my $self = shift; my $result = ''; @@ -2452,7 +2555,7 @@ BUTTONS } # Sort the fileList into order - @fileList = sort @fileList; + @fileList = sort {lc($a) cmp lc($b)} @fileList; $result .= $buttons; @@ -2504,14 +2607,16 @@ BUTTONS if ($status eq 'Published' && $helper->{VARS}->{'construction'}) { $onclick = 'onclick="a=1" '; } + my $id = &new_id(); $result .= '<tr><td align="right"' . " bgcolor='$color'>" . "<input $onclick type='$type' name='" . $var - . ".forminput' value='" . HTML::Entities::encode($fileName,'<>&"'). + . ".forminput' ".qq{id="$id"}." value='" . HTML::Entities::encode($fileName,"<>&\"'"). "'"; if (!$self->{'multichoice'} && $choices == 0) { $result .= ' checked'; } - $result .= "/></td><td bgcolor='$color'>" . $file . "</td>" . + $result .= "/></td><td bgcolor='$color'>". + qq{<label for="$id">}. $file . "</label></td>" . "<td bgcolor='$color'>$title</td>" . "<td bgcolor='$color'>$status</td>" . "</tr>\n"; $choices++; @@ -2539,10 +2644,14 @@ 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 $docroot = $Apache::lonnet::perlvar{'lonDocRoot'}; my $subdirpart = $constructionSpaceDir; - $subdirpart =~ s/^\/home\/$ENV{'user.name'}\/public_html//; - my $resdir = $docroot . '/res/' . $ENV{'user.domain'} . '/' . $ENV{'user.name'} . + $subdirpart =~ s/^\/home\/$uname\/public_html//; + my $resdir = $docroot . '/res/' . $udom . '/' . $uname . $subdirpart; my @constructionSpaceFileStat = stat($constructionSpaceDir . '/' . $file); @@ -2790,6 +2899,8 @@ be able to call methods on it. =cut +use Apache::lonlocal; + BEGIN { &Apache::lonhelper::register('Apache::lonhelper::general', 'exec', 'condition', 'clause', @@ -2911,6 +3022,9 @@ will make a "Finish Helper" button that which is useful for the Course Initialization helper so the users never see the old values taking effect. +If the parameter "restartCourse" is not true a 'Finish' Button will be +presented that takes the user back to whatever was defined as <exitpage> + =cut no strict; @@ -3008,8 +3122,12 @@ sub render { $result .= '</ul>'; } + my $actionURL = $self->{EXIT_PAGE}; + my $targetURL = ''; + my $finish=&mt('Finish'); if ($self->{'restartCourse'}) { - my $targetURL = '/adm/menu'; + my $actionURL = '/adm/roles'; + $targetURL = '/adm/menu'; if ($ENV{'course.'.$ENV{'request.course.id'}.'.url'}=~/^uploaded/) { $targetURL = '/adm/coursedocs'; } else { @@ -3018,25 +3136,24 @@ sub render { if ($ENV{'course.'.$ENV{'request.course.id'}.'.clonedfrom'}) { $targetURL = '/adm/parmset?overview=1'; } - my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"'); - my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"'); - $result .= "<center>\n" . - "<form action='/adm/roles' method='post' target='loncapaclient'>\n" . - "<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'} . - "' value='1' />\n<input type='submit' value='" . - &mt('Finish Course Initialization') . "' />\n" . - "</form></center>"; + my $finish=&mt('Finish Course Initialization'); } + my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"'); + my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"'); + $result .= "<center>\n" . + "<form action='".$actionURL."' method='post' target='loncapaclient'>\n" . + "<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'} . + "' value='1' />\n<input type='submit' value='" . $finish . "' />\n" . + "</form></center>"; return $result; } sub overrideForm { - my $self = shift; - return $self->{'restartCourse'}; + return 1; } 1; @@ -3113,8 +3230,7 @@ sub render { my $res = $navmap->getByMapPc($vars->{RESOURCE_ID}); my $title = $res->compTitle(); $symb = $res->symb(); - $navmap->untieHashes(); - $resourceString .= &mt('<li>for the map named <b>[_1]</b></li>',$title); + $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>'; $level = 8; $affectedResourceId = $vars->{RESOURCE_ID}; $paramlevel = 'map'; @@ -3123,8 +3239,7 @@ sub render { my $res = $navmap->getById($vars->{RESOURCE_ID}); $symb = $res->symb(); my $title = $res->compTitle(); - $navmap->untieHashes(); - $resourceString .= &mt('<li>for the resource named <b>[_1]</b></li>',$title); + $resourceString .= '<li>'.&mt('for the resource named [_1]',"<b>$title</b>").'</li>'; $level = 7; $affectedResourceId = $vars->{RESOURCE_ID}; $paramlevel = 'full'; @@ -3180,10 +3295,10 @@ sub render { $result .= '<li>'.&mt('for <b>all students in course</b>').'</li>'; } elsif ($vars->{TARGETS} eq 'section') { my $section = $vars->{SECTION_NAME}; - $result .= &mt('<li>for section <b>[_1]</b></li>',$section); + $result .= '<li>'.&mt('for section [_1]',"<b>$section</b>").'</li>'; $level -= 3; $result .= "<input type='hidden' name='csec' value='" . - HTML::Entities::encode($section,'<>&"') . "' />\n"; + HTML::Entities::encode($section,"'<>&\"") . "' />\n"; } else { # FIXME: This is probably wasteful! Store the name! my $classlist = Apache::loncoursedata::get_classlist(); @@ -3191,21 +3306,18 @@ sub render { # Chop off everything after the last colon (section) $username = substr($username, 0, rindex($username, ':')); my $name = $classlist->{$username}->[6]; - $result .= &mt('<li>for <b>[_1]</b></li>',$name); -## $result .= "<li>".&mt('for [_1]',"<b>$name</b>")."</li>"; + $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"; + HTML::Entities::encode($uname,"'<>&\"") . "' />\n"; $result .= "<input type='hidden' name='udom' value='". - HTML::Entities::encode($udom,'<>&"') . "' />\n"; + HTML::Entities::encode($udom,"'<>&\"") . "' />\n"; } # Print value if ($vars->{ACTION_TYPE} ne 'tries' && $vars->{ACTION_TYPE} ne 'weight') { - $result .= "<li>".&mt('to')." <b>" . ctime($vars->{PARM_DATE}) . "</b> (" . - Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}) - . ")</li>\n"; + $result .= '<li>'.&mt('to [_1] ([_2])',"<b>".ctime($vars->{PARM_DATE})."</b>",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."</li>\n"; } # print pres_marker