Diff for /loncom/interface/lonhelper.pm between versions 1.144 and 1.160

version 1.144, 2006/05/09 21:39:47 version 1.160, 2006/12/18 21:48:47
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 1021  sub postprocess { Line 1037  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 1388  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 1461  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'>&nbsp;</td>\n";          $result .= "<tr>\n<td width='20'>&nbsp;</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 1295  BUTTONS Line 1480  BUTTONS
             $choiceLabel. "</label></td>";              $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 1495  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 1519  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 1628  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 1654  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 1793  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 2024  sub render { Line 2207  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 2306  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 2340  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 2362  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 2275  use strict; Line 2458  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.  
 #     $multiselect  - True if multiselect allowed.  
 #     $resultname   - Name of result variable.  
 #  Returns:  
 #     HTML  text to add to the rendering of the helper.  
 #  
 sub render_student_list {  
     my (  
  $sections, $students, $formprefix, $defaultusers,  
  $multiselect, $resultname) = @_;  
   
     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="'.  
     $resultname.".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 (!$multiselect  && !$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 2435  sub render { Line 2502  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 2584  BUTTONS Line 2521  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 .= &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", 
     $self->{'multichoice'},      \%defaultUsers,
     $self->{'variable'});      $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 .= &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",
  $self->{'multichoice'},   "future",
  $self->{'variable'});   \%defaultUsers,
    $self->{'multichoice'},
    $self->{'variable'},
    0);
       }
       if (!$self->{'activeonly'} && ((scalar(@$expired_members)) > 0)) {
  # Past    # Past 
   
  $result .= &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",
  $self->{'multichoice'},         \%defaultUsers,
  $self->{'variable'});         $self->{'multichoice'},
          $self->{'variable'},
          0);
     }      }
   
   
Line 2737  BUTTONS Line 2585  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 2922  sub render { Line 2770  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 3039  BUTTONS Line 2887  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 3100  sub fileState { Line 2948  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 3190  sub start_section { Line 3038  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 3254  sub start_group { Line 3102  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 3336  sub render { Line 3184  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 3469  sub start_clause { Line 3317  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 3674  sub overrideForm { Line 3523  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 3742  sub render { Line 3591  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 3758  sub render { Line 3609  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 3775  sub render { Line 3628  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;

Removed from v.1.144  
changed lines
  Added in v.1.160


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>