Diff for /loncom/interface/lonhelper.pm between versions 1.147 and 1.161.2.1

version 1.147, 2006/05/09 22:43:19 version 1.161.2.1, 2007/10/02 00:33:02
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 1008  sub end_message { Line 1024  sub end_message {
 sub render {  sub render {
     my $self = shift;      my $self = shift;
   
     return &mtn($self->{MESSAGE_TEXT});      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 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 1292  BUTTONS Line 1477  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>";      $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 2274  no strict; Line 2457  no strict;
 use strict;  use strict;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 #  
 #  Utility function used when rendering <student> tags.  
 #  This function produces a list references to four  
 #  arrays:  
 #    (\@course_personel, \@current_members, \@expired_members, \@future_members)  
 #    
 # Where:  
 #    course_personnel - Each element of this array is itself a reference to an array  
 #                      containing information about a member of the course staff.  
 #    current_members  - Each element of this array is itself a reference to an  
 #                       array that contains information about current students in  
 #                       the course.  
 #    expired_members  - Each element of this array is itself a reference to an  
 #                       array that contains information about students whose   
 #                       status has expired.  
 #    future_members   - Each element of this arrya is itself a reference to an  
 #                       array that contains information about students who will  
 #                       become active at a future date.  
 #  
 #  Course personnel elements include:  
 #       [0]    Last, First of the user.  
 #       [1]    Role held by the user.  
 #       [2]    Empty.  
 #       [3]    Empty  
 #       [4]    username:domain of the user.  
 #  
 #  Student member array elements are:  
 #       [0]    Last, First of the user.  
 #       [1]    Status of the user one of ("Active", "Future", or "Expired')  
 #              depending on which array the user was put in.  
 #       [2]    Section the student is in.  
 #       [3]    Role of the member (student).  
 #       [4]    username:domain of the user.  
 #  
 sub get_people_in_class {  
     my %coursepersonnel = &Apache::lonnet::get_course_adv_roles();  
     #  
     #  Enumerate the course_personnel.  
     #  
     my @course_personnel;  
     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 @course_personnel, [join(':', @$person), $person->[0], '', $_];  
     }  
  }  
     }  
     #  Students must be split into the three categories:  
   
     my @current_members;  
     my @future_members;  
     my @expired_members;  
   
     #   Indices into the coures data elements.  
   
     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 $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"];  
     }  
   
  }  
     }  
     return (\@course_personnel,   
     \@current_members,  
     \@expired_members,  
     \@future_members);  
   
 }  
   
 #  
 #  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:  
 #     $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.  
 #     $javascript   - If true, the javascript to run this is output  
 #                     This should be true for the first call for a page  
 #                     and false for all other calls... only matters if  
 #                     multiselect is true.  
 #  Returns:  
 #     HTML  text to add to the rendering of the helper.  
 #  
 sub render_student_list {  
     my ($students, $formprefix, $defaultusers,  
  $multiselect, $resultname, $javascript) = @_;  
   
     my $result = "";  
   
     if ($javascript && $multiselect) {  
         $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  
   
     }  
   
     # 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) {  
  #  Make a section hash so we can add sections to the choice:  
   
  my %sections;  
  for my $student (@$students) {  
     my $sect = $student->[2];  
     if ($sect ne "") {  
  $sections{$sect} = 1;  
     }  
  }  
   
  $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',
Line 2692  sub render { Line 2524  sub render {
     my ($course_personnel,       my ($course_personnel, 
  $current_members,    $current_members, 
  $expired_members,    $expired_members, 
  $future_members) = &get_people_in_class();   $future_members) = 
       &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'});
   
   
   
Line 2705  sub render { Line 2538  sub render {
   
     #   Current personel      #   Current personel
   
     $result .= &render_student_list( $current_members,      $result .= '<h4>'.&mt('Select Currently Enrolled Students and Active Course Personnel').'</h4>';
      "current",      $result .= &Apache::lonselstudent::render_student_list( $current_members,
      \%defaultUsers,      "helpform",
      $self->{'multichoice'},      "current", 
      $self->{'variable'},      \%defaultUsers,
      1);      $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( $future_members,   $result .= '<h4>'.&mt('Select Future Enrolled Students and Future Course Personnel').'</h4>';
  "future",         
  \%defaultUsers,   $result .= &Apache::lonselstudent::render_student_list( $future_members,
  $self->{'multichoice'},   "helpform",
  $self->{'variable'},   "future",
  0);   \%defaultUsers,
    $self->{'multichoice'},
    $self->{'variable'},
    0);
       }
       if (!$self->{'activeonly'} && ((scalar(@$expired_members)) > 0)) {
  # Past    # Past 
   
  $result .= &render_student_list($expired_members,   $result .= '<h4>'.&mt('Select Previously Enrolled Students and Inactive Course Personnel').'</h4>';
  "past",   $result .= &Apache::lonselstudent::render_student_list($expired_members,
  \%defaultUsers,         "helpform",
  $self->{'multichoice'},         "past",
  $self->{'variable'},         \%defaultUsers,
  0);         $self->{'multichoice'},
          $self->{'variable'},
          0);
     }      }
   
   
Line 2743  sub render { Line 2585  sub render {
 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 2928  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 3045  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 3106  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 3196  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 3260  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 3342  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 3475  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 3680  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 3748  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 3764  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 3781  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.147  
changed lines
  Added in v.1.161.2.1


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