+
$stateTitle
HEADER
+ $result .= "";
+
$result .= <
@@ -684,7 +730,6 @@ sub addElement {
push @{$self->{ELEMENTS}}, $element;
}
-use Data::Dumper;
sub render {
my $self = shift;
my @results = ();
@@ -734,12 +779,30 @@ some setting accidentally.
Again, see the course initialization helper for examples.
+B
+
+Some elements that accepts user input can contain a "validator" tag that,
+when surrounded by "sub { my $helper = shift; my $state = shift; my $element = shift; my $val = shift "
+and "}", where "$val" is the value the user entered, will form a subroutine
+that when called will verify whether the given input is valid or not. If it
+is valid, the routine will return a false value. If invalid, the routine
+will return an error message to be displayed for the user.
+
+Consult the documentation for each element to see whether it supports this
+tag.
+
+B
+
+If the element stores the name of the variable in a 'variable' member, which
+the provided ones all do, you can retreive the value of the variable by calling
+this method.
+
=cut
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::element',
('nextstate', 'finalcode',
- 'defaultvalue'));
+ 'defaultvalue', 'validator'));
}
# Because we use the param hash, this is often a sufficent
@@ -804,6 +867,22 @@ sub start_defaultvalue {
sub end_defaultvalue { return ''; }
+sub start_validator {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target ne 'helper') {
+ return '';
+ }
+
+ $paramHash->{VALIDATOR} = &Apache::lonxml::get_all_text('/validator',
+ $parser);
+ $paramHash->{VALIDATOR} = 'sub { my $helper = shift; my $state = shift; my $element = shift; my $val = shift;' .
+ $paramHash->{VALIDATOR} . '}';
+ return '';
+}
+
+sub end_validator { return ''; }
+
sub preprocess {
return 1;
}
@@ -820,6 +899,11 @@ sub overrideForm {
return 0;
}
+sub getValue {
+ my $self = shift;
+ return $helper->{VARS}->{$self->{'variable'}};
+}
+
1;
package Apache::lonhelper::message;
@@ -1104,7 +1188,7 @@ BUTTONS
if (defined($self->{DEFAULT_VALUE})) {
$checkedChoicesFunc = eval ($self->{DEFAULT_VALUE});
die 'Error in default value code for variable ' .
- {'variable'} . ', Perl said:' . $@ if $@;
+ $self->{'variable'} . ', Perl said: ' . $@ if $@;
} else {
$checkedChoicesFunc = sub { return ''; };
}
@@ -1419,7 +1503,10 @@ variable stores the results. It also tak
which controls whether the user can select more then one resource. The
"toponly" attribute controls whether the resource display shows just the
resources in that sequence, or recurses into all sub-sequences, defaulting
-to false.
+to false. The "suppressEmptySequences" attribute reflects the
+suppressEmptySequences argument to the render routine, which will cause
+folders that have all of their contained resources filtered out to also
+be filtered out.
B
@@ -1480,6 +1567,7 @@ sub start_resource {
$paramHash->{'variable'} = $token->[2]{'variable'};
$helper->declareVar($paramHash->{'variable'});
$paramHash->{'multichoice'} = $token->[2]{'multichoice'};
+ $paramHash->{'suppressEmptySequences'} = $token->[2]{'suppressEmptySequences'};
$paramHash->{'toponly'} = $token->[2]{'toponly'};
return '';
}
@@ -1634,6 +1722,10 @@ BUTTONS
$col .= "checked ";
$checked = 1;
}
+ if ($multichoice) { # all resources start checked; see bug 1174
+ $col .= "checked ";
+ $checked = 1;
+ }
$col .= "value='" .
HTML::Entities::encode(&$valueFunc($resource))
. "' />";
@@ -1648,6 +1740,7 @@ BUTTONS
'showParts' => 0,
'filterFunc' => $filterFunc,
'resource_no_folder_link' => 1,
+ 'suppressEmptySequences' => $self->{'suppressEmptySequences'},
'iterator_map' => $mapUrl }
);
@@ -1861,6 +1954,8 @@ no strict;
@ISA = ("Apache::lonhelper::element");
use strict;
+use Apache::lonpubdir; # for getTitleString
+
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::files',
('files', 'filechoice', 'filefilter'));
@@ -2017,6 +2112,9 @@ BUTTONS
$color = '';
}
+ # Get the title
+ my $title = Apache::lonpubdir::getTitleString($fileName);
+
# Netscape 4 is stupid and there's nowhere to put the
# information on the input tag that the file is Published,
# Unpublished, etc. In *real* browsers we can just say
@@ -2043,8 +2141,9 @@ BUTTONS
if (!$self->{'multichoice'} && $choices == 0) {
$result .= ' checked';
}
- $result .= "/>" . $file .
- " $status \n";
+ $result .= "/>" . $file . " " .
+ "$title " .
+ "$status " . "\n";
$choices++;
}
}
@@ -2183,6 +2282,115 @@ sub end_section {
}
1;
+package Apache::lonhelper::string;
+
+=pod
+
+=head2 Element: string
+
+string elements provide a string entry field for the user. string elements
+take the usual 'variable' and 'nextstate' parameters. string elements
+also pass through 'maxlength' and 'size' attributes to the input tag.
+
+string honors the defaultvalue tag, if given.
+
+string honors the validation function, if given.
+
+=cut
+
+no strict;
+@ISA = ("Apache::lonhelper::element");
+use strict;
+
+BEGIN {
+ &Apache::lonhelper::register('Apache::lonhelper::string',
+ ('string'));
+}
+
+sub new {
+ my $ref = Apache::lonhelper::element->new();
+ bless($ref);
+}
+
+# CONSTRUCTION: Construct the message element from the XML
+sub start_string {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target ne 'helper') {
+ return '';
+ }
+
+ $paramHash->{'variable'} = $token->[2]{'variable'};
+ $helper->declareVar($paramHash->{'variable'});
+ $paramHash->{'nextstate'} = $token->[2]{'nextstate'};
+ $paramHash->{'maxlength'} = $token->[2]{'maxlength'};
+ $paramHash->{'size'} = $token->[2]{'size'};
+
+ return '';
+}
+
+sub end_string {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target ne 'helper') {
+ return '';
+ }
+ Apache::lonhelper::string->new();
+ return '';
+}
+
+sub render {
+ my $self = shift;
+ my $result = '';
+
+ if (defined $self->{ERROR_MSG}) {
+ $result .= '' . $self->{ERROR_MSG} . ' ';
+ }
+
+ $result .= ' {'size'})) {
+ $result .= ' size="' . $self->{'size'} . '"';
+ }
+ if (defined($self->{'maxlength'})) {
+ $result .= ' maxlength="' . $self->{'maxlength'} . '"';
+ }
+
+ if (defined($self->{DEFAULT_VALUE})) {
+ my $valueFunc = eval($self->{DEFAULT_VALUE});
+ die 'Error in default value code for variable ' .
+ $self->{'variable'} . ', Perl said: ' . $@ if $@;
+ $result .= ' value="' . &$valueFunc($helper, $self) . '"';
+ }
+
+ $result .= ' />';
+
+ return $result;
+}
+
+# If a NEXTSTATE was given, switch to it
+sub postprocess {
+ my $self = shift;
+
+ if (defined($self->{VALIDATOR})) {
+ my $validator = eval($self->{VALIDATOR});
+ die 'Died during evaluation of evaulation code; Perl said: ' . $@ if $@;
+ my $invalid = &$validator($helper, $state, $self, $self->getValue());
+ if ($invalid) {
+ $self->{ERROR_MSG} = $invalid;
+ return 0;
+ }
+ }
+
+ if (defined($self->{'nextstate'})) {
+ $helper->changeState($self->{'nextstate'});
+ }
+
+ return 1;
+}
+
+1;
+
package Apache::lonhelper::general;
=pod
@@ -2327,6 +2535,11 @@ tag. It goes through all the states and
snippets and collecting the results. Finally, it takes the user out of the
helper, going to a provided page.
+If the parameter "restartCourse" is true, this will override the buttons and
+will make a "Finish Helper" button that will re-initialize the course for them,
+which is useful for the Course Initialization helper so the users never see
+the old values taking effect.
+
=cut
no strict;
@@ -2343,7 +2556,17 @@ sub new {
bless($ref);
}
-sub start_final { return ''; }
+sub start_final {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target ne 'helper') {
+ return '';
+ }
+
+ $paramHash->{'restartCourse'} = $token->[2]{'restartCourse'};
+
+ return '';
+}
sub end_final {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
@@ -2384,13 +2607,13 @@ sub render {
for my $element (@{$state->{ELEMENTS}}) {
if (defined($element->{FINAL_CODE})) {
# Compile the code.
- my $code = 'sub { my $helper = shift; ' . $element->{FINAL_CODE} .
- '}';
+ my $code = 'sub { my $helper = shift; my $element = shift; '
+ . $element->{FINAL_CODE} . '}';
$code = eval($code);
die 'Error while executing final code for element with var ' .
$element->{'variable'} . ', Perl said: ' . $@ if $@;
- my $result = &$code($helper);
+ my $result = &$code($helper, $element);
if ($result) {
push @results, $result;
}
@@ -2406,9 +2629,30 @@ sub render {
for my $re (@results) {
$result .= ' ' . $re . " \n";
}
+
+ if (!@results) {
+ $result .= ' No changes were made to current settings. ';
+ }
+
+ if ($self->{'restartCourse'}) {
+ $result .= "\n" .
+ " ";
+ }
+
return $result . '';
}
+sub overrideForm {
+ my $self = shift;
+ return $self->{'restartCourse'};
+}
+
1;
package Apache::lonhelper::parmwizfinal;
@@ -2453,10 +2697,13 @@ sub render {
# FIXME: Unify my designators with the standard ones
my %dateTypeHash = ('open_date' => "Opening Date",
'due_date' => "Due Date",
- 'answer_date' => "Answer Date");
+ 'answer_date' => "Answer Date",
+ 'tries' => 'Number of Tries'
+ );
my %parmTypeHash = ('open_date' => "0_opendate",
'due_date' => "0_duedate",
- 'answer_date' => "0_answerdate");
+ 'answer_date' => "0_answerdate",
+ 'tries' => '0_maxtries' );
my $affectedResourceId = "";
my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}};
@@ -2476,7 +2723,7 @@ sub render {
my $navmap = Apache::lonnavmaps::navmap->new(
$ENV{"request.course.fn"}.".db",
$ENV{"request.course.fn"}."_parms.db", 0, 0);
- my $res = $navmap->getById($vars->{RESOURCE_ID});
+ my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
my $title = $res->compTitle();
$symb = $res->symb();
$navmap->untieHashes();
@@ -2502,8 +2749,11 @@ sub render {
$result .= 'Confirm that this information is correct, then click "Finish Wizard" to complete setting the parameter.
';
# Print the type of manipulation:
- $result .= 'Setting the ' . $dateTypeHash{$vars->{ACTION_TYPE}}
- . " \n";
+ $result .= 'Setting the ' . $dateTypeHash{$vars->{ACTION_TYPE}} . ' ';
+ if ($vars->{ACTION_TYPE} eq 'tries') {
+ $result .= ' to ' . $vars->{TRIES} . ' ';
+ }
+ $result .= " \n";
if ($vars->{ACTION_TYPE} eq 'due_date' ||
$vars->{ACTION_TYPE} eq 'answer_date') {
# for due dates, we default to "date end" type entries
@@ -2520,7 +2770,10 @@ sub render {
"value='" . $vars->{PARM_DATE} . "' />\n";
$result .= " \n";
- }
+ } elsif ($vars->{ACTION_TYPE} eq 'tries') {
+ $result .= " {TRIES} . "' />\n";
+ }
$result .= $resourceString;
@@ -2550,10 +2803,12 @@ sub render {
}
# Print value
- $result .= "to " . ctime($vars->{PARM_DATE}) . " (" .
- Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE})
- . ") \n";
-
+ if ($vars->{ACTION_TYPE} ne 'tries') {
+ $result .= "to " . ctime($vars->{PARM_DATE}) . " (" .
+ Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE})
+ . ") \n";
+ }
+
# print pres_marker
$result .= "\n \n";