--- loncom/interface/lonhelper.pm 2003/12/08 19:24:42 1.63
+++ loncom/interface/lonhelper.pm 2005/01/21 22:59:54 1.95
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# .helper XML handler to implement the LON-CAPA helper
#
-# $Id: lonhelper.pm,v 1.63 2003/12/08 19:24:42 matthew Exp $
+# $Id: lonhelper.pm,v 1.95 2005/01/21 22:59:54 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -230,7 +230,7 @@ my $paramHash;
# In the debugger, this means that breakpoints are ignored until you step into
# a function and get out of what must be a "faked up scope" in the Apache->
# mod_perl connection. In this code, it was manifesting itself in the existence
-# of two seperate file-scoped $helper variables, one set to the value of the
+# of two separate file-scoped $helper variables, one set to the value of the
# helper in the helper constructor, and one referenced by the handler on the
# "$helper->process()" line. Using the debugger, one could actually
# see the two different $helper variables, as hashes at completely
@@ -263,21 +263,13 @@ sub real_handler {
# Send header, don't cache this page
- if ($r->header_only) {
- if ($ENV{'browser.mathml'}) {
- $r->content_type('text/xml; charset=UTF-8');
- } else {
- $r->content_type('text/html; charset=UTF-8');
- }
- $r->send_http_header;
- return OK;
- }
if ($ENV{'browser.mathml'}) {
- $r->content_type('text/xml');
+ &Apache::loncommon::content_type($r,'text/xml');
} else {
- $r->content_type('text/html');
+ &Apache::loncommon::content_type($r,'text/html');
}
$r->send_http_header;
+ return OK if $r->header_only;
$r->rflush();
# Discard result, we just want the objects that get created by the
@@ -462,11 +454,11 @@ sub _saveVars {
my $self = shift;
my $result = "";
$result .= ' \n";
+ HTML::Entities::encode($self->{STATE},'<>&"') . "\" />\n";
$result .= ' \n";
$result .= ' \n";
+ HTML::Entities::encode($self->{RETURN_PAGE},'<>&"') . "\" />\n";
return $result;
}
@@ -583,7 +575,7 @@ sub display {
}
# Phase 4: Display.
- my $stateTitle = &mt($state->title());
+ my $stateTitle=&mt($state->title());
my $helperTitle = &mt($self->{TITLE});
my $bodytag = &Apache::loncommon::bodytag($helperTitle,'','');
my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
@@ -998,8 +990,8 @@ sub start_message {
return '';
}
- $paramHash->{MESSAGE_TEXT} = &Apache::lonxml::get_all_text('/message',
- $parser);
+ $paramHash->{MESSAGE_TEXT} = &mtn(&Apache::lonxml::get_all_text('/message',
+ $parser));
if (defined($token->[2]{'nextstate'})) {
$paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
@@ -1169,11 +1161,11 @@ sub start_choice {
}
my $computer = $token->[2]{'computer'};
- my $human = &Apache::lonxml::get_all_text('/choice',
- $parser);
+ my $human = &mt(&Apache::lonxml::get_all_text('/choice',
+ $parser));
my $nextstate = $token->[2]{'nextstate'};
my $evalFlag = $token->[2]{'eval'};
- push @{$paramHash->{CHOICES}}, [$human, $computer, $nextstate,
+ push @{$paramHash->{CHOICES}}, [&mtn($human), $computer, $nextstate,
$evalFlag];
return '';
}
@@ -1182,6 +1174,13 @@ sub end_choice {
return '';
}
+{
+ # used to generate unique id attributes for tags.
+ # internal use only.
+ my $id = 0;
+ sub new_id { return $id++; }
+}
+
sub render {
my $self = shift;
my $var = $self->{'variable'};
@@ -1206,10 +1205,13 @@ SCRIPT
# Only print "select all" and "unselect all" if there are five or
# more choices; fewer then that and it looks silly.
if ($self->{'multichoice'} && scalar(@{$self->{CHOICES}}) > 4) {
+ my %lt=&Apache::lonlocal::texthash(
+ 'sa' => "Select All",
+ 'ua' => "Unselect All");
$buttons = <
-
-
+
+
BUTTONS
}
@@ -1261,14 +1263,16 @@ BUTTONS
my $type = "radio";
if ($self->{'multichoice'}) { $type = 'checkbox'; }
foreach my $choice (@{$self->{CHOICES}}) {
+ my $id = &new_id();
$result .= "
\n \n";
$result .= " [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;" .
@@ -1276,7 +1280,8 @@ BUTTONS
$choiceLabel = eval($choiceLabel);
$choiceLabel = &$choiceLabel($helper, $self);
}
- $result .= "/> " . &mtn($choiceLabel) . " \n";
+ $result .= "/> ".qq{}.
+ $choiceLabel. " \n";
}
$result .= "\n\n\n";
$result .= $buttons;
@@ -1419,7 +1424,7 @@ sub render {
$result .= "\n";
foreach my $choice (@{$self->{CHOICES}}) {
$result .= "[1]}) {
$result .= " selected";
@@ -1710,7 +1715,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,7 +1762,7 @@ BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::resource',
('resource', 'filterfunc',
'choicefunc', 'valuefunc',
- 'mapurl'));
+ 'mapurl','option'));
}
sub new {
@@ -1777,6 +1784,11 @@ 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 '';
}
@@ -1859,6 +1871,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
@@ -1892,10 +1940,14 @@ sub render {
}
SCRIPT
+ my %lt=&Apache::lonlocal::texthash(
+ 'sar' => "Select All Resources",
+ 'uar' => "Unselect All Resources");
+
$buttons = <
-
-
+
+
BUTTONS
}
@@ -1906,10 +1958,14 @@ 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 $addparts = $self->{'addparts'};
+ my $headings_done = 0;
# Evaluate the map url as needed
my $mapUrl;
@@ -1927,15 +1983,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 .= "$text ";
+ }
+ }
+ $result .= "Select ";
+ $result .= ""; # 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 ' ';
+ $result .= ' ';
+ return $result;
} else {
- my $col = " &\"'");
+ if($option_vars) {
+ foreach my $option_var (@$option_vars) {
+ $col .=
+ " ";
+ }
+ }
+
+ $col .= " ";
- return $col;
+ $col .= "value='" . $resource_name . "' />";
+
+ return $result.$col;
}
};
+ my $renderPartsFunc = sub {
+ my ($resource, $part, $params) = @_;
+ my $col= "";
+ my $id=$resource->{ID};
+ my $resource_name =
+ &HTML::Entities::encode(&$valueFunc($resource),"<>&\"'");
+ if ($addparts && (scalar(@{$resource->parts}) > 1)) {
+ $col .= "\n";
+ $col .= "All Parts \n";
+ foreach my $part (@{$resource->parts}) {
+ $col .= "Part: $part \n";
+ }
+ $col .= " ";
+ }
+ $col .= " ";
+ };
+ $result.=(<
+ function updateRadio(form,name,value) {
+ var radiobutton=form[name];
+ for (var i=0; i
+ ;
+RADIO
$ENV{'form.condition'} = !$self->{'toponly'};
- my $cols = [$renderColFunc, Apache::lonnavmaps::resource()];
+ my $cols = [$renderColFunc];
+ if ($self->{'addparts'}) { push(@$cols, $renderPartsFunc); }
+ push(@$cols, Apache::lonnavmaps::resource());
if ($self->{'addstatus'}) {
push @$cols, (Apache::lonnavmaps::part_status_summary());
@@ -1962,6 +2080,7 @@ BUTTONS
'showParts' => 0,
'filterFunc' => $filterFunc,
'resource_no_folder_link' => 1,
+ 'closeAllPages' => $self->{'closeallpages'},
'suppressEmptySequences' => $self->{'suppressEmptySequences'},
'iterator_map' => $mapUrl }
);
@@ -2051,7 +2170,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'};
}
@@ -2088,7 +2207,9 @@ sub render {
for (i=0; i
SCRIPT
- my $selectAllStudents = &mt('Select All Students');
- my $unselectAllStudents = &mt('Unselect All Students');
+ my %lt=&Apache::lonlocal::texthash(
+ 'ocs' => "Select Only Current Students",
+ 'ues' => "Unselect Expired Students",
+ 'sas' => "Select All Students",
+ 'uas' => "Unselect All Students",
+ 'sfsg' => "Select Current Students for Section/Group",
+ 'ufsg' => "Unselect for Section/Group");
+
$buttons = <
-
-
-
-
-
-
+
BUTTONS
}
@@ -2170,15 +2317,15 @@ BUTTONS
}
}
- my $name = &mt($self->{'coursepersonnel'} ? 'Name' : 'Student Name');
+ my $name = $self->{'coursepersonnel'} ? &mt('Name') : &mt('Student Name');
my $type = 'radio';
if ($self->{'multichoice'}) { $type = 'checkbox'; }
$result .= "\n";
$result .= "$name ".
"" . &mt('Section') . " " .
- "Status " .
- "" . &mt("Role") . " " .
- "Username:Domain ";
+ "".&mt('Status')." " .
+ "" . &mt("Role") . " " .
+ "".&mt('Username').":".&mt('Domain')." ";
my $checked = 0;
for my $choice (@$choices) {
@@ -2190,17 +2337,20 @@ 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], "<>&\"'")
. "' />"
- . HTML::Entities::encode($choice->[1])
+ . HTML::Entities::encode($choice->[1],'<>&"')
. " "
- . HTML::Entities::encode($choice->[2])
+ . HTML::Entities::encode($choice->[2],'<>&"')
. " \n"
- . HTML::Entities::encode($choice->[3])
+ . HTML::Entities::encode($choice->[3],'<>&"')
. " \n"
- . HTML::Entities::encode($choice->[4])
+ . HTML::Entities::encode($choice->[4],'<>&"')
. " \n"
- . HTML::Entities::encode($choice->[0])
+ . HTML::Entities::encode($choice->[0],'<>&"')
. " \n";
}
@@ -2358,6 +2508,13 @@ sub start_filefilter {
sub end_filefilter { return ''; }
+{
+ # used to generate unique id attributes for tags.
+ # internal use only.
+ my $id=0;
+ sub new_id { return $id++;}
+}
+
sub render {
my $self = shift;
my $result = '';
@@ -2401,20 +2558,22 @@ sub render {
}
SCRIPT
- my $selectAllFiles = &mt("Select All Files");
- my $unselectAllFiles = &mt("Unselect All Files");
- $buttons = < "Select All Files",
+ 'uaf' => "Unselect All Files");
+ $buttons = <
-
-
+
+
BUTTONS
- my $selectAllPublished = &mt("Select All Published");
- my $unselectAllPublished= &mt("UnselectAllPublished");
+ %lt=&Apache::lonlocal::texthash(
+ 'sap' => "Select All Published",
+ 'uap' => "Unselect All Published");
if ($helper->{VARS}->{'construction'}) {
- $buttons .= <
-
+ $buttons .= <
+
BUTTONS
}
@@ -2442,7 +2601,7 @@ BUTTONS
}
# Sort the fileList into order
- @fileList = sort @fileList;
+ @fileList = sort {lc($a) cmp lc($b)} @fileList;
$result .= $buttons;
@@ -2494,14 +2653,16 @@ BUTTONS
if ($status eq 'Published' && $helper->{VARS}->{'construction'}) {
$onclick = 'onclick="a=1" ';
}
+ my $id = &new_id();
$result .= '" .
" {'multichoice'} && $choices == 0) {
$result .= ' checked';
}
- $result .= "/> " . $file . " " .
+ $result .= "/>".
+ qq{}. $file . " " .
"$title " .
"$status " . " \n";
$choices++;
@@ -2529,10 +2690,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);
@@ -2661,6 +2826,7 @@ string honors the validation function, i
no strict;
@ISA = ("Apache::lonhelper::element");
use strict;
+use Apache::lonlocal;
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::string',
@@ -2779,6 +2945,8 @@ be able to call methods on it.
=cut
+use Apache::lonlocal;
+
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::general',
'exec', 'condition', 'clause',
@@ -2900,6 +3068,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
+
=cut
no strict;
@@ -2997,30 +3168,38 @@ sub render {
$result .= '';
}
+ 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 {
+ $targetURL = '/adm/navmaps';
+ }
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 .= "\n" .
- " ";
+ my $finish=&mt('Finish Course Initialization');
}
+ my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
+ my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');
+ $result .= "\n" .
+ " ";
return $result;
}
sub overrideForm {
- my $self = shift;
- return $self->{'restartCourse'};
+ return 1;
}
1;
@@ -3035,6 +3214,7 @@ package Apache::lonhelper::parmwizfinal;
no strict;
@ISA = ('Apache::lonhelper::element');
use strict;
+use Apache::lonlocal;
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::parmwizfinal',
@@ -3083,10 +3263,10 @@ sub render {
my $resourceString;
my $symb;
my $paramlevel;
-
+
# Print the granularity, depending on the action
if ($vars->{GRANULARITY} eq 'whole_course') {
- $resourceString .= 'for all resources in the course ';
+ $resourceString .= ''.&mt('for all resources in the course ').' ';
$level = 9; # general course, see lonparmset.pm perldoc
$affectedResourceId = "0.0";
$symb = 'a';
@@ -3096,33 +3276,50 @@ sub render {
my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
my $title = $res->compTitle();
$symb = $res->symb();
- $navmap->untieHashes();
- $resourceString .= "for the map named $title ";
+ $resourceString .= ''.&mt('for the map named [_1]',"$title ").' ';
$level = 8;
$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();
- $navmap->untieHashes();
- $resourceString .= "for the resource named $title ";
+ $resourceString .= ''.&mt('for the resource named [_1] part [_2]',"$title ","$part ").' ';
$level = 7;
$affectedResourceId = $vars->{RESOURCE_ID};
$paramlevel = 'full';
}
my $result = "\n";
+ $result .= " \n";
return $result;
}