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

version 1.132, 2006/03/06 23:32:31 version 1.144, 2006/05/09 21:39:47
Line 184  use Apache::lonxml; Line 184  use Apache::lonxml;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   
   
 # 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 573  sub display { Line 574  sub display {
     }      }
   
     # Phase 4: Display.      # Phase 4: Display.
     my $html=&Apache::lonxml::xmlbegin();  
     my $stateTitle=&mt($state->title());      my $stateTitle=&mt($state->title());
     my $helperTitle = &mt($self->{TITLE});      my $browser_searcher_js = 
     my $browser_searcher_js = &Apache::loncommon::browser_and_searcher_javascript();   '<script type="text/javascript">'."\n".
     my $bodytag = &Apache::loncommon::bodytag($helperTitle,'','');   &Apache::loncommon::browser_and_searcher_javascript().
    "\n".'</script>';
   
       $result .= &Apache::loncommon::start_page($self->{TITLE},
         $browser_searcher_js);
       
     my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');      my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
     my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');      my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');
     # FIXME: This should be parameterized, not concatenated - Jeremy      # FIXME: This should be parameterized, not concatenated - Jeremy
     my $loncapaHelper = &mt("LON-CAPA Helper:");  
   
     $result .= <<HEADER;  
 $html  
     <head>  
         <title>$loncapaHelper: $helperTitle</title>  
         <script type="text/javascript">  
 $browser_searcher_js  
         </script>  
     </head>  
     $bodytag  
 HEADER  
     if (!$state->overrideForm()) { $result.="<form name='helpform' method='POST'>"; }      if (!$state->overrideForm()) { $result.="<form name='helpform' method='POST'>"; }
     $result .= <<HEADER;      $result .= <<HEADER;
         <table border="0" width='100%'><tr><td>          <table border="0" width='100%'><tr><td>
Line 655  HEADER Line 650  HEADER
             </tr>              </tr>
           </table>            </table>
         </form>          </form>
     </body>  
 </html>  
 FOOTER  FOOTER
   
       $result .= &Apache::loncommon::end_page();
     # Handle writing out the vars to the file      # Handle writing out the vars to the file
     my $file = Apache::File->new('>'.$self->{FILENAME});      my $file = Apache::File->new('>'.$self->{FILENAME});
     print $file $self->_varsInFile();      print $file $self->_varsInFile();
Line 1076  will be the state transistioned to if th Line 1070  will be the state transistioned to if th
 the choice is not multichoice. This will override the nextstate  the choice is not multichoice. This will override the nextstate
 passed to the parent C<choices> tag.  passed to the parent C<choices> tag.
   
   <choice> may optionally contain a 'relatedvalue' attribute, which
   if present will cause a text entry to appear to the right of the
   selection.  The value of the relatedvalue attribute is a variable
   into which the text entry will be stored e.g.:
   <choice computer='numberprovided" relatedvalue="num">Type the number in:</choice>
   
   <choice> may contain a relatededefault atribute which, if the
   relatedvalue attribute is present will be the initial value of the input
   box.
   
 =back  =back
   
 To create the choices programmatically, either wrap the choices in   To create the choices programmatically, either wrap the choices in 
Line 1166  sub start_choice { Line 1170  sub start_choice {
     my $computer = $token->[2]{'computer'};      my $computer = $token->[2]{'computer'};
     my $human = &mt(&Apache::lonxml::get_all_text('/choice',      my $human = &mt(&Apache::lonxml::get_all_text('/choice',
                                               $parser));                                                $parser));
     my $nextstate = $token->[2]{'nextstate'};      my $nextstate  = $token->[2]{'nextstate'};
     my $evalFlag = $token->[2]{'eval'};      my $evalFlag   = $token->[2]{'eval'};
       my $relatedVar = $token->[2]{'relatedvalue'}; 
       my $relatedDefault = $token->[2]{'relateddefault'};
     push @{$paramHash->{CHOICES}}, [&mtn($human), $computer, $nextstate,       push @{$paramHash->{CHOICES}}, [&mtn($human), $computer, $nextstate, 
                                     $evalFlag];                                      $evalFlag, $relatedVar, $relatedDefault];
     return '';      return '';
 }  }
   
Line 1279  BUTTONS Line 1285  BUTTONS
         }          }
         $result .= qq{id="id$id"};          $result .= qq{id="id$id"};
         my $choiceLabel = $choice->[0];          my $choiceLabel = $choice->[0];
         if ($choice->[4]) {  # if we need to evaluate this choice          if ($choice->[3]) {  # if we need to evaluate this choice
             $choiceLabel = "sub { my $helper = shift; my $state = shift;" .              $choiceLabel = "sub { my $helper = shift; my $state = shift;" .
                 $choiceLabel . "}";                  $choiceLabel . "}";
             $choiceLabel = eval($choiceLabel);              $choiceLabel = eval($choiceLabel);
             $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></tr>\n";              $choiceLabel. "</label></td>";
    if ($choice->[4]) {
       $result .='<td><input type="text" size="5" name="'
    .$choice->[4].'.forminput" value="'
                   .$choice->[5].'" /></td>';
    }
    $result .= "</tr>\n";
     }      }
     $result .= "</table>\n\n\n";      $result .= "</table>\n\n\n";
     $result .= $buttons;      $result .= $buttons;
Line 1320  sub postprocess { Line 1332  sub postprocess {
                 $helper->changeState($choice->[2]);                  $helper->changeState($choice->[2]);
             }              }
         }          }
    if ($choice->[4]) {
       my $varname = $choice->[4];
       $helper->{'VARS'}->{$varname} = $env{'form.'."$varname.forminput"};
    }
     }      }
     return 1;      return 1;
 }  }
Line 1561  sub render { Line 1577  sub render {
     my $date;      my $date;
   
     my $time=time;      my $time=time;
     $date = localtime($time);  
     $date->min(0);  
     my ($anytime,$onclick);      my ($anytime,$onclick);
   
     if (defined($self->{DEFAULT_VALUE})) {  
       # first check VARS for a valid new value from the user
       # then check DEFAULT_VALUE for a valid default time value
       # otherwise pick now as reasonably good time
   
       if (defined($helper->{VARS}{$var})
    &&  $helper->{VARS}{$var} > 0) {
    $date = localtime($helper->{VARS}{$var});
       } elsif (defined($self->{DEFAULT_VALUE})) {
         my $valueFunc = eval($self->{DEFAULT_VALUE});          my $valueFunc = eval($self->{DEFAULT_VALUE});
         die('Error in default value code for variable ' .           die('Error in default value code for variable ' . 
             $self->{'variable'} . ', Perl said: ' . $@) if $@;              $self->{'variable'} . ', Perl said: ' . $@) if $@;
         $time = &$valueFunc($helper, $self);          $time = &$valueFunc($helper, $self);
  if (lc($time) eq 'anytime') {   if (lc($time) eq 'anytime') {
     $anytime=1;      $anytime=1;
  } else {      $date = localtime(time);
       $date->min(0);
    } elsif (defined($time) && $time ne 0) {
     $date = localtime($time);      $date = localtime($time);
    } else {
       # leave date undefined so it'll default to now
  }   }
     } else {      }
   
       if (!defined($date)) {
    $date = localtime(time);
    $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 1685  CHECK Line 1717  CHECK
  if ($anytime) {   if ($anytime) {
     $result.=' checked="checked" '      $result.=' checked="checked" '
  }   }
  $result.="name='${var}anytime'/>".&mt('Anytime').'</label>'   $result.="name='${var}anytime'/>".&mt('Any time').'</label>'
     }      }
     return $result;      return $result;
   
Line 1732  sub postprocess { Line 1764  sub postprocess {
  $helper->{VARS}->{$var} = $chosenDate;   $helper->{VARS}->{$var} = $chosenDate;
     }      }
   
       if (defined($self->{VALIDATOR})) {
    my $validator = eval($self->{VALIDATOR});
    die 'Died during evaluation of validator code; Perl said: ' . $@ if $@;
    my $invalid = &$validator($helper, $state, $self, $self->getValue());
    if ($invalid) {
       $self->{ERROR_MSG} = $invalid;
       return 0;
    }
       }
   
     if (defined($self->{NEXTSTATE})) {      if (defined($self->{NEXTSTATE})) {
         $helper->changeState($self->{NEXTSTATE});          $helper->changeState($self->{NEXTSTATE});
     }      }
Line 2233  use strict; Line 2275  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 2281  sub render { Line 2439  sub render {
         $result = <<SCRIPT;          $result = <<SCRIPT;
 <script type="text/javascript">  <script type="text/javascript">
 // <!--  // <!--
     function checkall(value, checkName) {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {      function findElement(name) {
             ele = document.forms.helpform.elements[i];   var i;
             if (ele.name == checkName + '.forminput') {   var ele;
                 document.forms.helpform.elements[i].checked=value;   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 checksec(value) {      function isStudent(element) {
  for (i=0; i<document.forms.helpform.elements.length; i++) {   if(element.value.indexOf(":Student") != -1) {
     comp = document.forms.helpform.elements.chksec.value;      return 1;
             if (document.forms.helpform.elements[i].value.indexOf(':'+comp+':') != -1) {   }
  if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) {   return 0;
     document.forms.helpform.elements[i].checked=value;  
  }  
             }  
         }  
     }      }
     function checkactive() {      function section(element) {
  for (i=0; i<document.forms.helpform.elements.length; i++) {   var i;
             if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) {   var info;
                 document.forms.helpform.elements[i].checked=true;   if (element.value.indexOf(':') != -1) {
             }       info = element.value.split(':');
         }      return info[2];
    } else {
       return "";
    }
     }      }
     function checkexpired()  {      function rightSubForm(element, which) {
  for (i=0; i<document.forms.helpform.elements.length; i++) {   if (element.value.indexOf(which) != -1) {
             if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) {      return true;
                 document.forms.helpform.elements[i].checked=true;   } else {
             }       return false;
         }   }
     }      }
     function uncheckexpired() {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {      function setAllStudents(value, which) {
             if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) {   var i;
                 document.forms.helpform.elements[i].checked=false;   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 getDesiredState() {     // Return desired person state radio value.      function setAllCoursePersonnel(value, which) {
         numRadio = document.forms.helpform.personstate.length;   var i;
         for (i =0; i < numRadio; i++) {   var ele;
     if (document.forms.helpform.personstate[i].checked) {   for (i =0; i < document.forms.helpform.elements.length; i++) {
                 return document.forms.helpform.personstate[i].value;      ele = document.forms.helpform.elements[i];
             }      if(!isStudent(ele) && rightSubForm(ele, which)) {
         }   ele.checked = value;
         return "";      }
    }
     }      }
       function setSection(which, value, subform) {
     function checksections(value) {    // Check selected sections.   var i;
         numSections  = document.forms.helpform.chosensections.length;   var ele;
  desiredState = getDesiredState();   for (i =0; i < document.forms.helpform.elements.length; i++) {
       ele = document.forms.helpform.elements[i];
  for (var option = 0; option < numSections; option++) {      if (ele.value.indexOf(':') != -1) {
     if(document.forms.helpform.chosensections.options[option].selected) {   if ((section(ele) == which) && rightSubForm(ele, subform)) {
  section = document.forms.helpform.chosensections.options[option].text;      ele.checked = value;
  if (section == "none") {  
     section ="";  
  }   }
  for (i = 0; i < document.forms.helpform.elements.length; i++ ) {      }
     if (document.forms.helpform.elements[i].value.indexOf(':') != -1) {   }
  info = document.forms.helpform.elements[i].value.split(':');      }
  hisSection = info[2];  
  hisState   = info[4];      function setCheckboxes(listbox, which, value) {
  if (desiredState == hisState ||   var k;
     desiredState == "All") {   var elem;
     if(hisSection == section ||   var what;
        section =="" ) {          elem = findElement(listbox);
  document.forms.helpform.elements[i].checked = value;   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>
 SCRIPT  SCRIPT
Line 2381  SCRIPT Line 2562  SCRIPT
 </table>  </table>
 <br />  <br />
 BUTTONS  BUTTONS
     $result .= $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 2401  BUTTONS Line 2582  BUTTONS
  %defaultUsers = map { if ($_) {($_,1) } } @defaultUsers;   %defaultUsers = map { if ($_) {($_,1) } } @defaultUsers;
  delete($defaultUsers{''});   delete($defaultUsers{''});
     }      }
     my $choices = [];  
     my $expired_students = []; # Will hold expired students.  
   
       # 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'}) {      if ($self->{'coursepersonnel'}) {
Line 2419  BUTTONS Line 2620  BUTTONS
  @people = sort { $a->[0] cmp $b->[0] } @people;   @people = sort { $a->[0] cmp $b->[0] } @people;
   
  for my $person (@people) {   for my $person (@people) {
     push @$choices, [join(':', @$person), $person->[0], '', $_];      push @$current_members, [join(':', @$person), $person->[0], '', $_];
  }   }
     }      }
  }   }
     }      }
   
     # Constants  
     my $section = Apache::loncoursedata::CL_SECTION();  
     my $fullname = Apache::loncoursedata::CL_FULLNAME();  
     my $status = Apache::loncoursedata::CL_STATUS();  
   
     # Load up the students      # Load up the students
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
Line 2440  BUTTONS Line 2637  BUTTONS
         }          }
         return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname];          return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname];
     } @keys;      } @keys;
     #   
     #  now add the fancy section choice... first enumerate the sections:  
     if ($self->{'multichoice'}) {  
  my %sections;  
  for my $key (@keys) {  
     my $section_name = $classlist->{$key}->[$section];  
     if ($section_name ne "") {  
  $sections{$section_name} = 1;  
     }  
  }  
  #  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 $choice_widget = '<select multiple name="chosensections" size="'.$size.'">'."\n";  
  foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {  
     $choice_widget .= "<option name=\"$sec\">$sec</option>\n";  
  }  
  $choice_widget .= "<option>none</option></select>\n";  
   
  # Build a table without any borders to contain the section based  
  # selection:  
   
  my $section_selectors =<<SECTIONSELECT;  
 <table border="0">  
   <tr valign="top">  
    <td>For Sections:</td><td>$choice_widget</td>  
    <td><label><input type="radio" name="personstate" value="Active" checked />  
                Current Students</label></td>  
    <td><label><input type="radio" name="personstate" value="All" />  
                All students</label></td>  
    <td><label><input type="radio" name="personstate" value="Expired" />  
                Expired Students</label></td>  
   </tr>  
   <tr>  
    <td><input type="button" value="Select" onclick="checksections(true);" /></td>  
    <td><input type="button" value="Unselect" onclick="checksections(false);" /></td></tr>  
 </table>  
 <br />  
 SECTIONSELECT  
          $result .= $section_selectors;  
     }  
   
     # username, fullname, section, type  
     for (@keys) {      for (@keys) {
   
  # We split the active students into the choices array and  
         # inactive ones into expired_students so that we can put them in 2 separate  
  # tables.  
   
  if ( $classlist->{$_}->[$status] eq   if ( $classlist->{$_}->[$status] eq
     'Active') {      'Active') {
     push @$choices, [$_, $classlist->{$_}->[$fullname],       push @$current_members, [$_, $classlist->{$_}->[$fullname], 
      $classlist->{$_}->[$section],       $classlist->{$_}->[$section],
      $classlist->{$_}->[$status], 'Student'];       $classlist->{$_}->[$status], 'Student'];
  } else {   } else {
     push @$expired_students, [$_, $classlist->{$_}->[$fullname],       #  Need to figure out if this user is future or
       $classlist->{$_}->[$section],      #  Expired... If the start date is in the future
       $classlist->{$_}->[$status], 'Student'];      #  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"];
       }
   
  }   }
     }      }
   
     my $name = $self->{'coursepersonnel'} ? &mt('Name') : &mt('Student Name');  
     my $type = 'radio';  
     if ($self->{'multichoice'}) { $type = 'checkbox'; }  
     $result .= "<table cellspacing='2' cellpadding='2' border='0'>\n";  
     $result .= "<tr><td></td><td align='center'><b>$name</b></td>".  
         "<td align='center'><b>" . &mt('Section') . "</b></td>" .   
  "<td align='center'><b>".&mt('Status')."</b></td>" .   
  "<td align='center'><b>" . &mt("Role") . "</b></td>" .  
  "<td align='center'><b>".&mt('Username').":".&mt('Domain')."</b></td></tr>";  
   
     my $checked = 0;      # Create a list of the sections that can be used to create the section 
     #      # selection list boxes:
     # Give the active students and staff:  
     #      #
     for my $choice (@$choices) {      my %sections;
         $result .= "<tr><td><input type='$type' name='" .      for my $key (@keys) {
             $self->{'variable'} . '.forminput' . "'";   my $section_name = $classlist->{$key}->[$section];
                if ($section_name ne "") {
  if (%defaultUsers) {      $sections{$section_name} = 1;
     my $user=$choice->[0];   }
     if (exists($defaultUsers{$user})) {      }
  $result .= " checked='checked' ";  
  $checked = 1;  
     }      if ($self->{'multichoice'}) {
  } elsif (!$self->{'multichoice'} && !$checked) {  
             $result .= " checked='checked' ";   #  The variable $choice_widget will have the html to make the choice 
             $checked = 1;   #  selector.
         }   my $size=5;
         $result .=   if (scalar(keys(%sections)) < 5) {
             " value='" . HTML::Entities::encode($choice->[0] . ':'       $size=scalar(keys(%sections));
  .$choice->[2] . ':'    }
  .$choice->[1] . ':'    my $result = '<select multiple name="chosensections" size="'.$size.'">'."\n";
  .$choice->[3], "<>&\"'")   foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
             . "' /></td><td>"      $result .= "<option name=\"$sec\">$sec</option>\n";
             . HTML::Entities::encode($choice->[1],'<>&"')   }
             . "</td><td align='center'>"    $result .= "<option>none</option></select>\n";
             . HTML::Entities::encode($choice->[2],'<>&"')  
             . "</td>\n<td>"   
     . HTML::Entities::encode($choice->[3],'<>&"')  
             . "</td>\n<td>"   
     . HTML::Entities::encode($choice->[4],'<>&"')  
             . "</td>\n<td>"   
     . HTML::Entities::encode($choice->[0],'<>&"')  
     . "</td></tr>\n";  
     }      }
     $result .= "</table>\n\n";  
       #   Current personel
   
       $result .= &render_student_list(\%sections,
     $current_members,
     "current",
     \%defaultUsers,
       $self->{'multichoice'},
       $self->{'variable'});
   
   
     # 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_students) > 0)) {      if (!$self->{'activeonly'} && ((scalar @$expired_members) > 0)) {
  $result .= "<p>Inactive students: </p>\n";  
  $result .= <<INACTIVEBUTTONS;   # And future.
    <table>  
               <tr>   $result .= &render_student_list(\%sections,
                  <td><input type="button" value="Select expired" onclick="checkexpired();" /> </td>        $future_members,
  <td><input type="button" value="Unselect expired" onclick="uncheckexpired();" /></td>        "future",
               </tr>        \%defaultUsers,
            </table>   $self->{'multichoice'},
 INACTIVEBUTTONS   $self->{'variable'});
  $result .= "<table>\n";   # Past 
   
  for my $choice (@$expired_students) {   $result .= &render_student_list(\%sections,
         $result .= "<tr><td><input type='$type' name='" .        $expired_members,
             $self->{'variable'} . '.forminput' . "'";        "past",
                     \%defaultUsers,
  if (%defaultUsers) {   $self->{'multichoice'},
     my $user=$choice->[0];   $self->{'variable'});
     if (exists($defaultUsers{$user})) {  
  $result .= " checked='checked' ";  
  $checked = 1;  
     }  
  } elsif (!$self->{'multichoice'} && !$checked) {  
             $result .= " checked='checked' ";  
             $checked = 1;  
         }  
         $result .=  
             " value='" . HTML::Entities::encode($choice->[0] . ':'   
  .$choice->[2] . ':'   
  .$choice->[1] . ':'   
  .$choice->[3], "<>&\"'")  
             . "' /></td><td>"  
             . HTML::Entities::encode($choice->[1],'<>&"')  
             . "</td><td align='center'>"   
             . HTML::Entities::encode($choice->[2],'<>&"')  
             . "</td>\n<td>"   
     . HTML::Entities::encode($choice->[3],'<>&"')  
             . "</td>\n<td>"   
     . HTML::Entities::encode($choice->[4],'<>&"')  
             . "</td>\n<td>"   
     . HTML::Entities::encode($choice->[0],'<>&"')  
     . "</td></tr>\n";      
  }  
  $result .= "</table>\n";  
   
     }      }
   
   
Line 2996  package Apache::lonhelper::section; Line 3125  package Apache::lonhelper::section;
 <section> allows the user to choose one or more sections from the current  <section> allows the user to choose one or more sections from the current
 course.  course.
   
 It takes the standard attributes "variable", "multichoice", and  It takes the standard attributes "variable", "multichoice",
 "nextstate", meaning what they do for most other elements.  "allowempty" and "nextstate", meaning what they do for most other
   elements.
   
   also takes a boolean 'onlysections' whcih will restrict this to only
   have sections and not include groups
   
 =cut  =cut
   
Line 3027  sub start_section { Line 3160  sub start_section {
     $paramHash->{'variable'} = $token->[2]{'variable'};      $paramHash->{'variable'} = $token->[2]{'variable'};
     $helper->declareVar($paramHash->{'variable'});      $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};      $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
       $paramHash->{'allowempty'} = $token->[2]{'allowempty'};
     if (defined($token->[2]{'nextstate'})) {      if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};          $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
     }      }
Line 3036  sub start_section { Line 3170  sub start_section {
   
     my $section = Apache::loncoursedata::CL_SECTION();      my $section = Apache::loncoursedata::CL_SECTION();
     my $classlist = Apache::loncoursedata::get_classlist();      my $classlist = Apache::loncoursedata::get_classlist();
     foreach (keys %$classlist) {      foreach my $user (keys(%$classlist)) {
         my $sectionName = $classlist->{$_}->[$section];          my $section_name = $classlist->{$user}[$section];
         if (!$sectionName) {          if (!$section_name) {
             $choices{"No section assigned"} = "";              $choices{"No section assigned"} = "";
         } else {          } else {
             $choices{$sectionName} = $sectionName;              $choices{$section_name} = $section_name;
         }          }
     }       } 
         
     for my $sectionName (sort(keys(%choices))) {      if (exists($choices{"No section assigned"})) {
            push(@{$paramHash->{CHOICES}}, 
         push @{$paramHash->{CHOICES}}, [$sectionName, $sectionName];       ['No section assigned','No section assigned']);
    delete($choices{"No section assigned"});
       }
       for my $section_name (sort {lc($a) cmp lc($b) } (keys(%choices))) {
    push @{$paramHash->{CHOICES}}, [$section_name, $section_name];
       }
       return if ($token->[2]{'onlysections'});
   
       # add in groups to the end of the list
       my %curr_groups = &Apache::loncommon::coursegroups();
       foreach my $group_name (sort(keys(%curr_groups))) {
    push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]);
     }      }
 }      }    
   
Line 3067  package Apache::lonhelper::group; Line 3212  package Apache::lonhelper::group;
     
 =head2 Element: groupX<group, helper element>  =head2 Element: groupX<group, helper element>
     
 <section> allows the user to choose one or more groups from the current course.  <group> allows the user to choose one or more groups from the current course.
   
   It takes the standard attributes "variable", "multichoice",
    "allowempty" and "nextstate", meaning what they do for most other
    elements.
   
 It takes the standard attributes "variable", "multichoice", and "nextstate", meaning what they do for most other elements.  
    
 =cut  =cut
   
 no strict;  no strict;
Line 3099  sub start_group { Line 3246  sub start_group {
     $paramHash->{'variable'} = $token->[2]{'variable'};      $paramHash->{'variable'} = $token->[2]{'variable'};
     $helper->declareVar($paramHash->{'variable'});      $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};      $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
       $paramHash->{'allowempty'} = $token->[2]{'allowempty'};
     if (defined($token->[2]{'nextstate'})) {      if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};          $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
     }      }
Line 3106  sub start_group { Line 3254  sub start_group {
     # Populate the CHOICES element      # Populate the CHOICES element
     my %choices;      my %choices;
   
     my $numgroups;      my %curr_groups = &Apache::loncommon::coursegroups();
     my %curr_groups;      foreach my $group_name (sort {lc($a) cmp lc($b)} (keys(%curr_groups))) {
     if (&Apache::loncommon::coursegroups(\%curr_groups)) {   push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]);
         foreach my $group_name (keys %curr_groups) {  
             $choices{$group_name} = $group_name;  
         }  
     }  
     foreach my $group_name (sort(keys(%choices))) {  
         push @{$paramHash->{CHOICES}}, [$group_name, $group_name];  
     }      }
 }  }
                                                                                       
 sub end_group {  sub end_group {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
Line 3221  sub postprocess { Line 3363  sub postprocess {
   
     if (defined($self->{VALIDATOR})) {      if (defined($self->{VALIDATOR})) {
  my $validator = eval($self->{VALIDATOR});   my $validator = eval($self->{VALIDATOR});
  die 'Died during evaluation of evaulation code; Perl said: ' . $@ if $@;   die 'Died during evaluation of validator code; Perl said: ' . $@ if $@;
  my $invalid = &$validator($helper, $state, $self, $self->getValue());   my $invalid = &$validator($helper, $state, $self, $self->getValue());
  if ($invalid) {   if ($invalid) {
     $self->{ERROR_MSG} = $invalid;      $self->{ERROR_MSG} = $invalid;

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


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