+
$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 ''; };
}
@@ -1638,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))
. "' />";
@@ -1866,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'));
@@ -2022,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
@@ -2048,8 +2141,9 @@ BUTTONS
if (!$self->{'multichoice'} && $choices == 0) {
$result .= ' checked';
}
- $result .= "/>" . $file .
- " $status \n";
+ $result .= "/>" . $file . " " .
+ "$title " .
+ "$status " . "\n";
$choices++;
}
}
@@ -2188,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
@@ -2332,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;
@@ -2348,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)=@_;
@@ -2389,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;
}
@@ -2411,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;
@@ -2458,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}};
@@ -2481,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();
@@ -2507,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
@@ -2525,7 +2770,10 @@ sub render {
"value='" . $vars->{PARM_DATE} . "' />\n";
$result .= " \n";
- }
+ } elsif ($vars->{ACTION_TYPE} eq 'tries') {
+ $result .= " {TRIES} . "' />\n";
+ }
$result .= $resourceString;
@@ -2555,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";