version 1.143, 2006/05/09 18:15:39
|
version 1.163, 2007/09/01 00:41:42
|
Line 81 State tags are also required to have an
|
Line 81 State tags are also required to have an
|
human name of the state, and will be displayed as the header on top of |
human name of the state, and will be displayed as the header on top of |
the screen for the user. |
the screen for the user. |
|
|
|
State tags may also optionally have an attribute "help" which should be |
|
the filename of a help file, this will add a blue ? to the title. |
|
|
=head2 Example Helper Skeleton |
=head2 Example Helper Skeleton |
|
|
An example of the tags so far: |
An example of the tags so far: |
|
|
<helper title="Example Helper"> |
<helper title="Example Helper"> |
<state name="START" title="Demonstrating the Example Helper"> |
<state name="START" title="Demonstrating the Example Helper"> |
<!-- notice this is the START state the wizard requires --> |
<!-- notice this is the START state the helper requires --> |
</state> |
</state> |
<state name="GET_NAME" title="Enter Student Name"> |
<state name="GET_NAME" title="Enter Student Name"> |
</state> |
</state> |
</helper> |
</helper> |
|
|
Of course this does nothing. In order for the wizard to do something, it is |
Of course this does nothing. In order for the helper to do something, it is |
necessary to put actual elements into the wizard. Documentation for each |
necessary to put actual elements into the helper. Documentation for each |
of these elements follows. |
of these elements follows. |
|
|
=head1 Creating a Helper With Code, Not XML |
=head1 Creating a Helper With Code, Not XML |
|
|
In some situations, such as the printing wizard (see lonprintout.pm), |
In some situations, such as the printing helper (see lonprintout.pm), |
writing the helper in XML would be too complicated, because of scope |
writing the helper in XML would be too complicated, because of scope |
issues or the fact that the code actually outweighs the XML. It is |
issues or the fact that the code actually outweighs the XML. It is |
possible to create a helper via code, though it is a little odd. |
possible to create a helper via code, though it is a little odd. |
Line 183 use Apache::File;
|
Line 186 use Apache::File;
|
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::longroup; |
|
use Apache::lonselstudent; |
|
use LONCAPA; |
|
|
# Register all the tags with the helper, so the helper can |
# Register all the tags with the helper, so the helper can |
# push and pop them |
# push and pop them |
Line 332 sub start_state {
|
Line 337 sub start_state {
|
} |
} |
|
|
Apache::lonhelper::state->new($token->[2]{'name'}, |
Apache::lonhelper::state->new($token->[2]{'name'}, |
$token->[2]{'title'}); |
$token->[2]{'title'}, |
|
$token->[2]{'help'}); |
return ''; |
return ''; |
} |
} |
|
|
Line 362 use Apache::loncommon;
|
Line 368 use Apache::loncommon;
|
use Apache::File; |
use Apache::File; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use LONCAPA; |
|
|
sub new { |
sub new { |
my $proto = shift; |
my $proto = shift; |
Line 467 sub _saveVars {
|
Line 474 sub _saveVars {
|
sub _varsInFile { |
sub _varsInFile { |
my $self = shift; |
my $self = shift; |
my @vars = (); |
my @vars = (); |
for my $key (keys %{$self->{VARS}}) { |
for my $key (keys(%{$self->{VARS}})) { |
push @vars, &Apache::lonnet::escape($key) . '=' . |
push(@vars, &escape($key) . '=' . &escape($self->{VARS}->{$key})); |
&Apache::lonnet::escape($self->{VARS}->{$key}); |
|
} |
} |
return join ('&', @vars); |
return join ('&', @vars); |
} |
} |
Line 484 sub declareVar {
|
Line 490 sub declareVar {
|
$self->{VARS}->{$var} = ''; |
$self->{VARS}->{$var} = ''; |
} |
} |
|
|
my $envname = 'form.' . $var . '.forminput'; |
my $envname = 'form.' . $var . '_forminput'; |
if (defined($env{$envname})) { |
if (defined($env{$envname})) { |
if (ref($env{$envname})) { |
if (ref($env{$envname})) { |
$self->{VARS}->{$var} = join('|||', @{$env{$envname}}); |
$self->{VARS}->{$var} = join('|||', @{$env{$envname}}); |
Line 575 sub display {
|
Line 581 sub display {
|
|
|
# Phase 4: Display. |
# Phase 4: Display. |
my $stateTitle=&mt($state->title()); |
my $stateTitle=&mt($state->title()); |
|
my $stateHelp= $state->help(); |
my $browser_searcher_js = |
my $browser_searcher_js = |
'<script type="text/javascript">'."\n". |
'<script type="text/javascript">'."\n". |
&Apache::loncommon::browser_and_searcher_javascript(). |
&Apache::loncommon::browser_and_searcher_javascript(). |
Line 589 sub display {
|
Line 596 sub display {
|
|
|
|
|
if (!$state->overrideForm()) { $result.="<form name='helpform' method='POST'>"; } |
if (!$state->overrideForm()) { $result.="<form name='helpform' method='POST'>"; } |
|
if ($stateHelp) { |
|
$stateHelp = &Apache::loncommon::help_open_topic($stateHelp); |
|
} |
$result .= <<HEADER; |
$result .= <<HEADER; |
<table border="0" width='100%'><tr><td> |
<table border="0" width='100%'><tr><td> |
<h2><i>$stateTitle</i></h2> |
<h2><i>$stateTitle</i>$stateHelp</h2> |
HEADER |
HEADER |
|
|
$result .= "<table cellpadding='10' width='100%'><tr><td rowspan='2' valign='top'>"; |
$result .= "<table cellpadding='10' width='100%'><tr><td rowspan='2' valign='top'>"; |
Line 678 sub new {
|
Line 688 sub new {
|
|
|
$self->{NAME} = shift; |
$self->{NAME} = shift; |
$self->{TITLE} = shift; |
$self->{TITLE} = shift; |
|
$self->{HELP} = shift; |
$self->{ELEMENTS} = []; |
$self->{ELEMENTS} = []; |
|
|
bless($self, $class); |
bless($self, $class); |
Line 699 sub title {
|
Line 710 sub title {
|
return $self->{TITLE}; |
return $self->{TITLE}; |
} |
} |
|
|
|
sub help { |
|
my $self = shift; |
|
return $self->{HELP}; |
|
} |
|
|
sub preprocess { |
sub preprocess { |
my $self = shift; |
my $self = shift; |
for my $element (@{$self->{ELEMENTS}}) { |
for my $element (@{$self->{ELEMENTS}}) { |
Line 790 the element. How this value is interpret
|
Line 806 the element. How this value is interpret
|
the element itself, and possibly the settings the element has (such as |
the element itself, and possibly the settings the element has (such as |
multichoice vs. single choice for <choices> tags). |
multichoice vs. single choice for <choices> tags). |
|
|
This is also intended for things like the course initialization wizard, where the |
This is also intended for things like the course initialization helper, where the |
user is setting various parameters. By correctly grabbing current settings |
user is setting various parameters. By correctly grabbing current settings |
and including them into the helper, it allows the user to come back to the |
and including them into the helper, it allows the user to come back to the |
helper later and re-execute it, without needing to worry about overwriting |
helper later and re-execute it, without needing to worry about overwriting |
Line 992 sub start_message {
|
Line 1008 sub start_message {
|
if (defined($token->[2]{'nextstate'})) { |
if (defined($token->[2]{'nextstate'})) { |
$paramHash->{NEXTSTATE} = $token->[2]{'nextstate'}; |
$paramHash->{NEXTSTATE} = $token->[2]{'nextstate'}; |
} |
} |
|
if (defined($token->[2]{'type'})) { |
|
$paramHash->{TYPE} = $token->[2]{'type'}; |
|
} |
return ''; |
return ''; |
} |
} |
|
|
Line 1007 sub end_message {
|
Line 1026 sub end_message {
|
|
|
sub render { |
sub render { |
my $self = shift; |
my $self = shift; |
|
|
return &mtn($self->{MESSAGE_TEXT}); |
if ($self->{TYPE} =~ /^\s*warning\s*$/i) { |
|
$self->{MESSAGE_TEXT} = |
|
'<span class="LC_warning">'. $self->{MESSAGE_TEXT}.'</span>'; |
|
} |
|
if ($self->{TYPE} =~ /^\s*error\s*$/i) { |
|
$self->{MESSAGE_TEXT} = |
|
'<span class="LC_error">'. $self->{MESSAGE_TEXT}.'</span>'; |
|
} |
|
return $self->{MESSAGE_TEXT}; |
} |
} |
# If a NEXTSTATE was given, switch to it |
# If a NEXTSTATE was given, switch to it |
sub postprocess { |
sub postprocess { |
Line 1021 sub postprocess {
|
Line 1048 sub postprocess {
|
} |
} |
1; |
1; |
|
|
|
package Apache::lonhelper::helpicon; |
|
|
|
=pod |
|
|
|
=head1 Elements |
|
|
|
=head2 Element: helpiconX<helpicon, helper element> |
|
|
|
Helpicon elements add a help icon at the current location. |
|
Example: |
|
|
|
<helpicon file="Help"> |
|
General Help |
|
</helpicon> |
|
|
|
In this example will generate a help icon to the Help.hlp url with a |
|
description of 'General Help'. The description is not required and if |
|
left out (Example: <helpicon file="Help" /> only the icon will be |
|
added.) |
|
|
|
=head3 Localization |
|
|
|
The description text will be run through the normalize_string function |
|
and that will be used as a call to &mt. |
|
|
|
=cut |
|
|
|
no strict; |
|
@ISA = ("Apache::lonhelper::element"); |
|
use strict; |
|
use Apache::lonlocal; |
|
|
|
BEGIN { |
|
&Apache::lonhelper::register('Apache::lonhelper::helpicon', |
|
('helpicon')); |
|
} |
|
|
|
sub new { |
|
my $ref = Apache::lonhelper::element->new(); |
|
bless($ref); |
|
} |
|
|
|
# CONSTRUCTION: Construct the message element from the XML |
|
sub start_helpicon { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
|
if ($target ne 'helper') { |
|
return ''; |
|
} |
|
|
|
$paramHash->{HELP_TEXT} = &mtn(&Apache::lonxml::get_all_text('/helpicon', |
|
$parser)); |
|
|
|
$paramHash->{HELP_TEXT} =~s/^\s+//; |
|
$paramHash->{HELP_TEXT} =~s/\s+$//; |
|
|
|
if (defined($token->[2]{'file'})) { |
|
$paramHash->{HELP_FILE} = $token->[2]{'file'}; |
|
} |
|
return ''; |
|
} |
|
|
|
sub end_helpicon { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
|
if ($target ne 'helper') { |
|
return ''; |
|
} |
|
Apache::lonhelper::helpicon->new(); |
|
return ''; |
|
} |
|
|
|
sub render { |
|
my $self = shift; |
|
|
|
my $text; |
|
if ( $self->{HELP_TEXT} ne '') { |
|
$text=&mtn($self->{HELP_TEXT}); |
|
} |
|
|
|
return &Apache::loncommon::help_open_topic($self->{HELP_FILE}, |
|
$text); |
|
} |
|
sub postprocess { |
|
my $self = shift; |
|
if (defined($self->{NEXTSTATE})) { |
|
$helper->changeState($self->{NEXTSTATE}); |
|
} |
|
|
|
return 1; |
|
} |
|
|
|
1; |
|
|
|
package Apache::lonhelper::skip; |
|
|
|
=pod |
|
|
|
=head1 Elements |
|
|
|
=head2 Element: skipX<skip> |
|
|
|
The <skip> tag allows you define conditions under which the current state |
|
should be skipped over and define what state to skip to. |
|
|
|
<state name="SKIP"> |
|
<skip> |
|
<clause> |
|
#some code that decides whether to skip the state or not |
|
</clause> |
|
<nextstate>FINISH</nextstate> |
|
</skip> |
|
<message nextstate="FINISH">A possibly skipped state</message> |
|
</state> |
|
|
|
=cut |
|
|
|
no strict; |
|
@ISA = ("Apache::lonhelper::element"); |
|
use strict; |
|
|
|
BEGIN { |
|
&Apache::lonhelper::register('Apache::lonhelper::skip', |
|
('skip')); |
|
} |
|
|
|
sub new { |
|
my $ref = Apache::lonhelper::element->new(); |
|
bless($ref); |
|
} |
|
|
|
sub start_skip { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
|
if ($target ne 'helper') { |
|
return ''; |
|
} |
|
# let <cluase> know what text to skip to |
|
$paramHash->{SKIPTAG}='/skip'; |
|
return ''; |
|
} |
|
|
|
sub end_skip { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
|
if ($target ne 'helper') { |
|
return ''; |
|
} |
|
Apache::lonhelper::skip->new(); |
|
return ''; |
|
} |
|
|
|
sub render { |
|
my $self = shift; |
|
return ''; |
|
} |
|
# If a NEXTSTATE is set, switch to it |
|
sub preprocess { |
|
my ($self) = @_; |
|
|
|
if (defined($self->{NEXTSTATE})) { |
|
$helper->changeState($self->{NEXTSTATE}); |
|
} |
|
|
|
return 1; |
|
} |
|
|
|
1; |
|
|
package Apache::lonhelper::choices; |
package Apache::lonhelper::choices; |
|
|
=pod |
=pod |
Line 1203 sub render {
|
Line 1399 sub render {
|
function checkall(value, checkName) { |
function checkall(value, checkName) { |
for (i=0; i<document.forms.helpform.elements.length; i++) { |
for (i=0; i<document.forms.helpform.elements.length; i++) { |
ele = document.forms.helpform.elements[i]; |
ele = document.forms.helpform.elements[i]; |
if (ele.name == checkName + '.forminput') { |
if (ele.name == checkName + '_forminput') { |
document.forms.helpform.elements[i].checked=value; |
document.forms.helpform.elements[i].checked=value; |
} |
} |
} |
} |
Line 1276 BUTTONS
|
Line 1472 BUTTONS
|
foreach my $choice (@{$self->{CHOICES}}) { |
foreach my $choice (@{$self->{CHOICES}}) { |
my $id = &new_id(); |
my $id = &new_id(); |
$result .= "<tr>\n<td width='20'> </td>\n"; |
$result .= "<tr>\n<td width='20'> </td>\n"; |
$result .= "<td valign='top'><input type='$type' name='$var.forminput'" |
$result .= "<td valign='top'><input type='$type' name='${var}_forminput'" |
. " value='" . |
. " value='" . |
HTML::Entities::encode($choice->[1],"<>&\"'") |
HTML::Entities::encode($choice->[1],"<>&\"'") |
. "'"; |
. "'"; |
Line 1292 BUTTONS
|
Line 1488 BUTTONS
|
$choiceLabel = &$choiceLabel($helper, $self); |
$choiceLabel = &$choiceLabel($helper, $self); |
} |
} |
$result .= "/></td><td> ".qq{<label for="id$id">}. |
$result .= "/></td><td> ".qq{<label for="id$id">}. |
$choiceLabel. "</label></td>"; |
&mtn($choiceLabel). "</label></td>"; |
if ($choice->[4]) { |
if ($choice->[4]) { |
$result .='<td><input type="text" size="5" name="' |
$result .='<td><input type="text" size="5" name="' |
.$choice->[4].'.forminput" value="' |
.$choice->[4].'_forminput" value="' |
.$choice->[5].'" /></td>'; |
.$choice->[5].'" /></td>'; |
} |
} |
$result .= "</tr>\n"; |
$result .= "</tr>\n"; |
Line 1310 BUTTONS
|
Line 1506 BUTTONS
|
# given, switch to it |
# given, switch to it |
sub postprocess { |
sub postprocess { |
my $self = shift; |
my $self = shift; |
my $chosenValue = $env{'form.' . $self->{'variable'} . '.forminput'}; |
my $chosenValue = $env{'form.' . $self->{'variable'} . '_forminput'}; |
|
|
if (!defined($chosenValue) && !$self->{'allowempty'}) { |
if (!defined($chosenValue) && !$self->{'allowempty'}) { |
$self->{ERROR_MSG} = |
$self->{ERROR_MSG} = |
Line 1334 sub postprocess {
|
Line 1530 sub postprocess {
|
} |
} |
if ($choice->[4]) { |
if ($choice->[4]) { |
my $varname = $choice->[4]; |
my $varname = $choice->[4]; |
$helper->{'VARS'}->{$varname} = $env{'form.'."$varname.forminput"}; |
$helper->{'VARS'}->{$varname} = $env{'form.'."${varname}_forminput"}; |
} |
} |
} |
} |
return 1; |
return 1; |
Line 1443 sub render {
|
Line 1639 sub render {
|
$checkedChoices{$self->{CHOICES}->[0]->[1]} = 1; |
$checkedChoices{$self->{CHOICES}->[0]->[1]} = 1; |
} |
} |
|
|
$result .= "<select name='${var}.forminput'>\n"; |
$result .= "<select name='${var}_forminput'>\n"; |
foreach my $choice (@{$self->{CHOICES}}) { |
foreach my $choice (@{$self->{CHOICES}}) { |
$result .= "<option value='" . |
$result .= "<option value='" . |
HTML::Entities::encode($choice->[1],"<>&\"'") |
HTML::Entities::encode($choice->[1],"<>&\"'") |
Line 1469 sub render {
|
Line 1665 sub render {
|
# given, switch to it |
# given, switch to it |
sub postprocess { |
sub postprocess { |
my $self = shift; |
my $self = shift; |
my $chosenValue = $env{'form.' . $self->{'variable'} . '.forminput'}; |
my $chosenValue = $env{'form.' . $self->{'variable'} . '_forminput'}; |
|
|
if (!defined($chosenValue) && !$self->{'allowempty'}) { |
if (!defined($chosenValue) && !$self->{'allowempty'}) { |
$self->{ERROR_MSG} = "You must choose one or more choices to" . |
$self->{ERROR_MSG} = "You must choose one or more choices to" . |
Line 1608 sub render {
|
Line 1804 sub render {
|
$date->min(0); |
$date->min(0); |
} |
} |
|
|
&Apache::lonnet::logthis("date mode "); |
|
|
|
if ($anytime) { |
if ($anytime) { |
$onclick = "onclick=\"javascript:updateCheck(this.form,'${var}anytime',false)\""; |
$onclick = "onclick=\"javascript:updateCheck(this.form,'${var}anytime',false)\""; |
} |
} |
Line 1806 folders that have all of their contained
|
Line 2000 folders that have all of their contained
|
be filtered out. The 'addstatus' attribute, if true, will add the icon |
be filtered out. The 'addstatus' attribute, if true, will add the icon |
and long status display columns to the display. The 'addparts' |
and long status display columns to the display. The 'addparts' |
attribute will add in a part selector beside problems that have more |
attribute will add in a part selector beside problems that have more |
than 1 part. |
than 1 part. The 'includecourse' attribute if true, will include |
|
the toplevel default.sequence in the results. |
|
|
=head3 SUB-TAGS |
=head3 SUB-TAGS |
|
|
Line 1879 sub start_resource {
|
Line 2074 sub start_resource {
|
$helper->declareVar($paramHash->{'variable'}.'_part'); |
$helper->declareVar($paramHash->{'variable'}.'_part'); |
} |
} |
$paramHash->{'closeallpages'} = $token->[2]{'closeallpages'}; |
$paramHash->{'closeallpages'} = $token->[2]{'closeallpages'}; |
|
$paramHash->{'include_top_level_map'} = $token->[2]{'includecourse'}; |
return ''; |
return ''; |
} |
} |
|
|
Line 2024 sub render {
|
Line 2220 sub render {
|
function checkall(value, checkName) { |
function checkall(value, checkName) { |
for (i=0; i<document.forms.helpform.elements.length; i++) { |
for (i=0; i<document.forms.helpform.elements.length; i++) { |
ele = document.forms.helpform.elements[i]; |
ele = document.forms.helpform.elements[i]; |
if (ele.name == checkName + '.forminput') { |
if (ele.name == checkName + '_forminput') { |
document.forms.helpform.elements[i].checked=value; |
document.forms.helpform.elements[i].checked=value; |
} |
} |
} |
} |
Line 2123 BUTTONS
|
Line 2319 BUTTONS
|
} |
} |
$col .= |
$col .= |
"<td align='center'><input type='checkbox' name ='$option_var". |
"<td align='center'><input type='checkbox' name ='$option_var". |
".forminput' value='". |
"_forminput' value='". |
$resource_name . "' $checked /> </td>"; |
$resource_name . "' $checked /> </td>"; |
} |
} |
} |
} |
|
|
$col .= "<td align='center'><input type='$inputType' name='${var}.forminput' "; |
$col .= "<td align='center'><input type='$inputType' name='${var}_forminput' "; |
if (%defaultSymbs) { |
if (%defaultSymbs) { |
my $symb=$resource->symb(); |
my $symb=$resource->symb(); |
if (exists($defaultSymbs{$symb})) { |
if (exists($defaultSymbs{$symb})) { |
Line 2157 BUTTONS
|
Line 2353 BUTTONS
|
my $resource_name = |
my $resource_name = |
&HTML::Entities::encode(&$valueFunc($resource),"<>&\"'"); |
&HTML::Entities::encode(&$valueFunc($resource),"<>&\"'"); |
if ($addparts && (scalar(@{$resource->parts}) > 1)) { |
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 .= "<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"; |
$col .= "<option value=\"$part\">All Parts</option>\n"; |
foreach my $part (@{$resource->parts}) { |
foreach my $part (@{$resource->parts}) { |
$col .= "<option value=\"$part\">Part: $part</option>\n"; |
$col .= "<option value=\"$part\">Part: $part</option>\n"; |
Line 2179 BUTTONS
|
Line 2375 BUTTONS
|
} |
} |
} |
} |
function updateHidden(form,id,name) { |
function updateHidden(form,id,name) { |
var select=form['part_'+id+'.forminput']; |
var select=form['part_'+id+'_forminput']; |
var hidden=form[name+'_part.forminput']; |
var hidden=form[name+'_part_forminput']; |
var which=select.selectedIndex; |
var which=select.selectedIndex; |
hidden.value=select.options[which].value; |
hidden.value=select.options[which].value; |
} |
} |
// --> |
// --> |
</script> |
</script> |
<input type="hidden" name="${var}_part.forminput" /> |
<input type="hidden" name="${var}_part_forminput" /> |
|
|
RADIO |
RADIO |
$env{'form.condition'} = !$self->{'toponly'}; |
$env{'form.condition'} = !$self->{'toponly'}; |
Line 2204 RADIO
|
Line 2400 RADIO
|
'resource_no_folder_link' => 1, |
'resource_no_folder_link' => 1, |
'closeAllPages' => $self->{'closeallpages'}, |
'closeAllPages' => $self->{'closeallpages'}, |
'suppressEmptySequences' => $self->{'suppressEmptySequences'}, |
'suppressEmptySequences' => $self->{'suppressEmptySequences'}, |
|
'include_top_level_map' => $self->{'include_top_level_map'}, |
'iterator_map' => $mapUrl } |
'iterator_map' => $mapUrl } |
); |
); |
|
|
Line 2275 use strict;
|
Line 2472 use strict;
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
|
# |
|
# Utility function used when rendering the <student> tag. |
|
# This function renders a segment of course personel |
|
# Personel are broken up by the helper into past, current and |
|
# future...each one gets is own subpage of selection. |
|
# This sub renders one of these pages. |
|
# Parameters: |
|
# $sections - Set of sections in the course (hash reference). |
|
# $students - Students in the section. (ref to array of references |
|
# to arrays). |
|
# $formprefix - form path prefix for form element names |
|
# This is used to make each form element |
|
# so that the segments having to do with each |
|
# set of students won't collide. |
|
# $defaultusers - reference to a hash containng |
|
# the set of users that should be on or off. |
|
# Returns: |
|
# HTML text to add to the rendering of the helper. |
|
# |
|
sub render_student_list { |
|
my ($self, |
|
$sections, $students, $formprefix, $defaultusers) = @_; |
|
|
|
my $multiselect = $self->{'multichoice'}; |
|
my $result = ""; |
|
|
|
# If multiple selections are allowed, we have a listbox |
|
# at the top which allows quick selections from each section |
|
# as well as from categories of personnel. |
|
|
|
if ($multiselect) { |
|
$result .= '<table><tr><td>'; |
|
|
|
my $size = scalar(keys(%$sections)); |
|
$size += 3; # We have allstudents allpersonel nosection too. |
|
if ($size > 5) { |
|
$size = 5; |
|
} |
|
$result .= '<select multiple name="'.$formprefix |
|
.'.chosensections" size="'.$size.'">'."\n"; |
|
$result .= '<option name="allstudents">All Students</option>'; |
|
$result .= '<option name="allpersonnel">All Course Personnel</option>'; |
|
$result .= '<option name="nosection">No Section</option>'; |
|
$result .= "\n"; |
|
foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%$sections))) { |
|
$result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n"; |
|
} |
|
$result .= '</td><td valign="top">'; |
|
$result .= '<input type="button" name="'.$formprefix.'.select" value="Select" onclick=' |
|
."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>'; |
|
$result .= '<td valign="top"><input type="button" name="'.$formprefix |
|
.'.unselect" value="Unselect" onclick='. |
|
"'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>'; |
|
} |
|
|
|
# Now we list the students, but the form element type |
|
# will depend on whether or not multiselect is true. |
|
# True -> checkboxes. |
|
# False -> radiobuttons. |
|
|
|
$result .= "<table border=\"2\">\n"; |
|
$result .= '<tr><th></th><th align="center">Name</th>'."\n"; |
|
$result .= ' <th align="center">Section</th>'."\n"; |
|
$result .= ' <th align="center">Status</th>'."\n"; |
|
$result .= ' <th align="center">Role</th>'."\n"; |
|
$result .= ' <th align="center">Username : Domain</th></tr>'."\n"; |
|
|
|
my $input_type; |
|
if ($multiselect) { |
|
$input_type = "checkbox"; |
|
} else { |
|
$input_type = "radio"; |
|
} |
|
|
|
my $checked = 0; |
|
for my $student (@$students) { |
|
$result .= '<tr><td><input type="'.$input_type.'" name="'. |
|
$self->{'variable'}.".forminput".'"'; |
|
my $user = $student->[0]; |
|
|
|
# Figure out which students are checked by default... |
|
|
|
if(%$defaultusers) { |
|
if (exists ($defaultusers->{$user})) { |
|
$result .= ' checked ="checked" '; |
|
$checked = 1; |
|
} |
|
} elsif (!$self->{'multichoice'} && !$checked) { |
|
$result .= ' checked="checked" '; |
|
$checked = 1; # First one for radio if no default specified. |
|
} |
|
$result .= ' value="'. HTML::Entities::encode($user . ':' |
|
.$student->[2] . ':' |
|
.$student->[1] . ':' |
|
.$student->[3] . ':' |
|
.$student->[4] . ":" |
|
.$formprefix, "<>&\"'") |
|
."\" /></td><td>\n"; |
|
$result .= HTML::Entities::encode($student->[1], '<>&"') |
|
. '</td><td align="center" >'."\n"; |
|
$result .= HTML::Entities::encode($student->[2], '<>&"') |
|
. '</td><td align="center">'."\n"; |
|
$result .= HTML::Entities::encode($student->[3], '<>&"') |
|
. '</td><td align="center">'."\n"; |
|
$result .= HTML::Entities::encode($student->[4], '<>&"') |
|
. '</td><td align="center">'."\n"; |
|
$result .= HTML::Entities::encode($student->[0], '<>&"') |
|
. '</td></tr>'."\n"; |
|
} |
|
$result .=" </table> <br /> <hr />\n"; |
|
|
|
return $result; |
|
} |
|
|
|
BEGIN { |
BEGIN { |
&Apache::lonhelper::register('Apache::lonhelper::student', |
&Apache::lonhelper::register('Apache::lonhelper::student', |
('student')); |
('student')); |
Line 2433 sub render {
|
Line 2516 sub render {
|
my $buttons = ''; |
my $buttons = ''; |
my $var = $self->{'variable'}; |
my $var = $self->{'variable'}; |
|
|
if ($self->{'multichoice'}) { |
|
$result = <<SCRIPT; |
|
<script type="text/javascript"> |
|
// <!-- |
|
|
|
function findElement(name) { |
|
var i; |
|
var ele; |
|
for(i =0; i < document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if(ele.name == name) { |
|
return ele; |
|
} |
|
} |
|
return null; |
|
} |
|
function isStudent(element) { |
|
if(element.value.indexOf(":Student") != -1) { |
|
return 1; |
|
} |
|
return 0; |
|
} |
|
function section(element) { |
|
var i; |
|
var info; |
|
if (element.value.indexOf(':') != -1) { |
|
info = element.value.split(':'); |
|
return info[2]; |
|
} else { |
|
return ""; |
|
} |
|
} |
|
function rightSubForm(element, which) { |
|
if (element.value.indexOf(which) != -1) { |
|
return true; |
|
} else { |
|
return false; |
|
} |
|
} |
|
|
|
function setAllStudents(value, which) { |
|
var i; |
|
var ele; |
|
for (i =0; i < document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if(isStudent(ele) && rightSubForm(ele, which)) { |
|
ele.checked=value; |
|
} |
|
} |
|
} |
|
function setAllCoursePersonnel(value, which) { |
|
var i; |
|
var ele; |
|
for (i =0; i < document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if(!isStudent(ele) && rightSubForm(ele, which)) { |
|
ele.checked = value; |
|
} |
|
} |
|
} |
|
function setSection(which, value, subform) { |
|
var i; |
|
var ele; |
|
for (i =0; i < document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if (ele.value.indexOf(':') != -1) { |
|
if ((section(ele) == which) && rightSubForm(ele, subform)) { |
|
ele.checked = value; |
|
} |
|
} |
|
} |
|
} |
|
|
|
function setCheckboxes(listbox, which, value) { |
|
var k; |
|
var elem; |
|
var what; |
|
elem = findElement(listbox); |
|
if (elem != null) { |
|
for (k = 0; k < elem.length; k++) { |
|
if (elem.options[k].selected) { |
|
what = elem.options[k].text; |
|
if (what == 'All Students') { |
|
setAllStudents(value, which); |
|
} else if (what == 'All Course Personnel') { |
|
setAllCoursePersonnel(value, which); |
|
} else if (what == 'No Section') { |
|
setSection('',value, which); |
|
} else { |
|
setSection(what, value, which); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
function selectSections(listbox, which) { |
|
setCheckboxes(listbox, which, true); |
|
|
|
} |
|
function unselectSections(listbox, which) { |
|
setCheckboxes(listbox, which, false); |
|
} |
|
|
|
// --> |
|
</script> |
|
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 Current Students for Section/Group", |
|
'ufsg' => "Unselect for Section/Group"); |
|
|
|
$buttons = <<BUTTONS; |
|
<br /> |
|
<table> |
|
|
|
<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> |
|
|
|
</table> |
|
<br /> |
|
BUTTONS |
|
# $result .= $buttons; |
|
|
|
} |
|
|
|
if (defined $self->{ERROR_MSG}) { |
if (defined $self->{ERROR_MSG}) { |
$result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />'; |
$result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />'; |
Line 2582 BUTTONS
|
Line 2535 BUTTONS
|
} |
} |
|
|
|
|
|
my ($course_personnel, |
|
$current_members, |
|
$expired_members, |
|
$future_members) = |
|
&Apache::lonselstudent::get_people_in_class($env{'request.course.sec'}); |
|
|
# my $choices = []; |
|
|
|
# |
|
# We need to parcel out the personel in to three arrays: |
|
# $current_members[] - Contains those whose roles are currently active. |
|
# $expired_members[] - Contains those whose roles have expired. |
|
# $future_members[] - Contains those whose roles will become active in the |
|
# future. |
|
# |
|
# Constants |
|
my $section = &Apache::loncoursedata::CL_SECTION(); |
|
my $fullname = &Apache::loncoursedata::CL_FULLNAME(); |
|
my $status = &Apache::loncoursedata::CL_STATUS(); |
|
my $start_date = &Apache::loncoursedata::CL_START(); |
|
|
|
my $current_members = []; |
|
my $expired_members = []; |
|
my $future_members = []; |
|
|
|
|
|
# Load up the non-students, if necessary |
# Load up the non-students, if necessary |
if ($self->{'coursepersonnel'}) { |
|
my %coursepersonnel = Apache::lonnet::get_course_adv_roles(); |
|
for (sort keys %coursepersonnel) { |
|
for my $role (split /,/, $coursepersonnel{$_}) { |
|
# extract the names so we can sort them |
|
my @people; |
|
|
|
for (split /,/, $role) { |
|
push @people, [split /:/, $role]; |
|
} |
|
|
|
@people = sort { $a->[0] cmp $b->[0] } @people; |
|
|
|
for my $person (@people) { |
|
push @$current_members, [join(':', @$person), $person->[0], '', $_]; |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
if ($self->{'coursepersonnel'}) { |
# Load up the students |
unshift @$current_members, (@$course_personnel); |
my $classlist = &Apache::loncoursedata::get_classlist(); |
|
my @keys = keys %{$classlist}; |
|
# Sort by: Section, name |
|
@keys = sort { |
|
if ($classlist->{$a}->[$section] ne $classlist->{$b}->[$section]) { |
|
return $classlist->{$a}->[$section] cmp $classlist->{$b}->[$section]; |
|
} |
|
return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname]; |
|
} @keys; |
|
|
|
|
|
|
|
|
|
for (@keys) { |
|
|
|
if ( $classlist->{$_}->[$status] eq |
|
'Active') { |
|
push @$current_members, [$_, $classlist->{$_}->[$fullname], |
|
$classlist->{$_}->[$section], |
|
$classlist->{$_}->[$status], 'Student']; |
|
} else { |
|
# Need to figure out if this user is future or |
|
# Expired... If the start date is in the future |
|
# the user is future...else expired. |
|
|
|
my $now = time; |
|
if ($classlist->{$_}->[$start_date] > $now) { |
|
push @$future_members, [$_, $classlist->{$_}->[$fullname], |
|
$classlist->{$_}->[$section], |
|
"Future", "Student"]; |
|
} else { |
|
push @$expired_members, [$_, $classlist->{$_}->[$fullname], |
|
$classlist->{$_}->[$section], |
|
"Expired", "Student"]; |
|
} |
|
|
|
} |
|
} |
|
|
|
|
|
# Create a list of the sections that can be used to create the section |
|
# selection list boxes: |
|
# |
|
my %sections; |
|
for my $key (@keys) { |
|
my $section_name = $classlist->{$key}->[$section]; |
|
if ($section_name ne "") { |
|
$sections{$section_name} = 1; |
|
} |
|
} |
} |
|
|
|
|
if ($self->{'multichoice'}) { |
|
|
|
# The variable $choice_widget will have the html to make the choice |
|
# selector. |
|
my $size=5; |
|
if (scalar(keys(%sections)) < 5) { |
|
$size=scalar(keys(%sections)); |
|
} |
|
my $result = '<select multiple name="chosensections" size="'.$size.'">'."\n"; |
|
foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) { |
|
$result .= "<option name=\"$sec\">$sec</option>\n"; |
|
} |
|
$result .= "<option>none</option></select>\n"; |
|
|
|
|
|
} |
|
|
|
# Current personel |
# Current personel |
|
|
$result .= $self->render_student_list(\%sections, |
$result .= '<h4>'.&mt('Select Currently Enrolled Students and Active Course Personnel').'</h4>'; |
$current_members, |
$result .= &Apache::lonselstudent::render_student_list( $current_members, |
"current", |
"helpform", |
\%defaultUsers); |
"current", |
|
\%defaultUsers, |
|
$self->{'multichoice'}, |
|
$self->{'variable'}, |
|
1); |
|
|
|
|
# If activeonly is not set then we can also give the expired students: |
# If activeonly is not set then we can also give the expired students: |
# |
# |
if (!$self->{'activeonly'} && ((scalar @$expired_members) > 0)) { |
if (!$self->{'activeonly'} && ((scalar(@$future_members)) > 0)) { |
|
|
# And future. |
# And future. |
|
|
$result .= $self->render_student_list(\%sections, |
$result .= '<h4>'.&mt('Select Future Enrolled Students and Future Course Personnel').'</h4>'; |
$future_members, |
|
"future", |
$result .= &Apache::lonselstudent::render_student_list( $future_members, |
\%defaultUsers); |
"helpform", |
|
"future", |
|
\%defaultUsers, |
|
$self->{'multichoice'}, |
|
$self->{'variable'}, |
|
0); |
|
} |
|
if (!$self->{'activeonly'} && ((scalar(@$expired_members)) > 0)) { |
# Past |
# Past |
|
|
$result .= $self->render_student_list(\%sections, |
$result .= '<h4>'.&mt('Select Previously Enrolled Students and Inactive Course Personnel').'</h4>'; |
$expired_members, |
$result .= &Apache::lonselstudent::render_student_list($expired_members, |
"past", |
"helpform", |
\%defaultUsers); |
"past", |
|
\%defaultUsers, |
|
$self->{'multichoice'}, |
|
$self->{'variable'}, |
|
0); |
} |
} |
|
|
|
|
Line 2729 BUTTONS
|
Line 2599 BUTTONS
|
sub postprocess { |
sub postprocess { |
my $self = shift; |
my $self = shift; |
|
|
my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; |
my $result = $env{'form.' . $self->{'variable'} . '_forminput'}; |
if (!$result && !$self->{'emptyallowed'}) { |
if (!$result && !$self->{'emptyallowed'}) { |
if ($self->{'coursepersonnel'}) { |
if ($self->{'coursepersonnel'}) { |
$self->{ERROR_MSG} = |
$self->{ERROR_MSG} = |
Line 2914 sub render {
|
Line 2784 sub render {
|
function checkall(value, checkName) { |
function checkall(value, checkName) { |
for (i=0; i<document.forms.helpform.elements.length; i++) { |
for (i=0; i<document.forms.helpform.elements.length; i++) { |
ele = document.forms.helpform.elements[i]; |
ele = document.forms.helpform.elements[i]; |
if (ele.name == checkName + '.forminput') { |
if (ele.name == checkName + '_forminput') { |
document.forms.helpform.elements[i].checked=value; |
document.forms.helpform.elements[i].checked=value; |
} |
} |
} |
} |
Line 3031 BUTTONS
|
Line 2901 BUTTONS
|
my $id = &new_id(); |
my $id = &new_id(); |
$result .= '<tr><td align="right"' . " bgcolor='$color'>" . |
$result .= '<tr><td align="right"' . " bgcolor='$color'>" . |
"<input $onclick type='$type' name='" . $var |
"<input $onclick type='$type' name='" . $var |
. ".forminput' ".qq{id="$id"}." value='" . HTML::Entities::encode($fileName,"<>&\"'"). |
. "_forminput' ".qq{id="$id"}." value='" . HTML::Entities::encode($fileName,"<>&\"'"). |
"'"; |
"'"; |
if (!$self->{'multichoice'} && $choices == 0) { |
if (!$self->{'multichoice'} && $choices == 0) { |
$result .= ' checked="checked"'; |
$result .= ' checked="checked"'; |
Line 3092 sub fileState {
|
Line 2962 sub fileState {
|
|
|
sub postprocess { |
sub postprocess { |
my $self = shift; |
my $self = shift; |
my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; |
my $result = $env{'form.' . $self->{'variable'} . '_forminput'}; |
if (!$result) { |
if (!$result) { |
$self->{ERROR_MSG} = 'You must choose at least one file '. |
$self->{ERROR_MSG} = 'You must choose at least one file '. |
'to continue.'; |
'to continue.'; |
Line 3182 sub start_section {
|
Line 3052 sub start_section {
|
return if ($token->[2]{'onlysections'}); |
return if ($token->[2]{'onlysections'}); |
|
|
# add in groups to the end of the list |
# add in groups to the end of the list |
my %curr_groups = &Apache::loncommon::coursegroups(); |
my %curr_groups = &Apache::longroup::coursegroups(); |
foreach my $group_name (sort(keys(%curr_groups))) { |
foreach my $group_name (sort(keys(%curr_groups))) { |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
} |
} |
Line 3246 sub start_group {
|
Line 3116 sub start_group {
|
# Populate the CHOICES element |
# Populate the CHOICES element |
my %choices; |
my %choices; |
|
|
my %curr_groups = &Apache::loncommon::coursegroups(); |
my %curr_groups = &Apache::longroup::coursegroups(); |
foreach my $group_name (sort {lc($a) cmp lc($b)} (keys(%curr_groups))) { |
foreach my $group_name (sort {lc($a) cmp lc($b)} (keys(%curr_groups))) { |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
} |
} |
Line 3328 sub render {
|
Line 3198 sub render {
|
$result .= '<p><font color="#FF0000">' . $self->{ERROR_MSG} . '</font></p>'; |
$result .= '<p><font color="#FF0000">' . $self->{ERROR_MSG} . '</font></p>'; |
} |
} |
|
|
$result .= '<input type="string" name="' . $self->{'variable'} . '.forminput"'; |
$result .= '<input type="string" name="' . $self->{'variable'} . '_forminput"'; |
|
|
if (defined($self->{'size'})) { |
if (defined($self->{'size'})) { |
$result .= ' size="' . $self->{'size'} . '"'; |
$result .= ' size="' . $self->{'size'} . '"'; |
Line 3461 sub start_clause {
|
Line 3331 sub start_clause {
|
die 'Error in clause of condition, Perl said: ' . $@ if $@; |
die 'Error in clause of condition, Perl said: ' . $@ if $@; |
if (!&$clause($helper, $paramHash)) { |
if (!&$clause($helper, $paramHash)) { |
# Discard all text until the /condition. |
# Discard all text until the /condition. |
&Apache::lonxml::get_all_text('/condition', $parser); |
my $end_tag = $paramHash->{SKIPTAG} || '/condition'; |
|
&Apache::lonxml::get_all_text($end_tag, $parser); |
} |
} |
} |
} |
|
|
Line 3666 sub overrideForm {
|
Line 3537 sub overrideForm {
|
|
|
package Apache::lonhelper::parmwizfinal; |
package Apache::lonhelper::parmwizfinal; |
|
|
# This is the final state for the parmwizard. It is not generally useful, |
# This is the final state for the parm helper. It is not generally useful, |
# so it is not perldoc'ed. It does its own processing. |
# so it is not perldoc'ed. It does its own processing. |
# It is represented with <parmwizfinal />, and |
# It is represented with <parmwizfinal />, and |
# should later be moved to lonparmset.pm . |
# should later be moved to lonparmset.pm . |
Line 3734 sub render {
|
Line 3605 sub render {
|
if ($vars->{GRANULARITY} eq 'whole_course') { |
if ($vars->{GRANULARITY} eq 'whole_course') { |
$resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>'; |
$resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>'; |
if ($vars->{TARGETS} eq 'course') { |
if ($vars->{TARGETS} eq 'course') { |
$level = 11; # general course, see lonparmset.pm perldoc |
$level = 14; # general course, see lonparmset.pm perldoc |
} elsif ($vars->{TARGETS} eq 'section') { |
} elsif ($vars->{TARGETS} eq 'section') { |
|
$level = 9; |
|
} elsif ($vars->{TARGETS} eq 'group') { |
$level = 6; |
$level = 6; |
} else { |
} else { |
$level = 3; |
$level = 3; |
Line 3750 sub render {
|
Line 3623 sub render {
|
$symb = $res->symb(); |
$symb = $res->symb(); |
$resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>'; |
$resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>'; |
if ($vars->{TARGETS} eq 'course') { |
if ($vars->{TARGETS} eq 'course') { |
$level = 10; # general course, see lonparmset.pm perldoc |
$level = 13; # general course, see lonparmset.pm perldoc |
} elsif ($vars->{TARGETS} eq 'section') { |
} elsif ($vars->{TARGETS} eq 'section') { |
|
$level = 8; |
|
} elsif ($vars->{TARGETS} eq 'group') { |
$level = 5; |
$level = 5; |
} else { |
} else { |
$level = 2; |
$level = 2; |
Line 3767 sub render {
|
Line 3642 sub render {
|
my $title = $res->compTitle(); |
my $title = $res->compTitle(); |
$resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>'; |
$resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>'; |
if ($vars->{TARGETS} eq 'course') { |
if ($vars->{TARGETS} eq 'course') { |
$level = 7; # general course, see lonparmset.pm perldoc |
$level = 10; # general course, see lonparmset.pm perldoc |
} elsif ($vars->{TARGETS} eq 'section') { |
} elsif ($vars->{TARGETS} eq 'section') { |
|
$level = 7; |
|
} elsif ($vars->{TARGETS} eq 'group') { |
$level = 4; |
$level = 4; |
} else { |
} else { |
$level = 1; |
$level = 1; |