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

version 1.147, 2006/05/09 22:43:19 version 1.148, 2006/05/11 21:10:21
Line 183  use Apache::File; Line 183  use Apache::File;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::lonselstudent;
   
 # 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 2274  no strict; Line 2274  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 2341  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();
   
   
   
Line 2705  sub render { Line 2354  sub render {
   
     #   Current personel      #   Current personel
   
     $result .= &render_student_list( $current_members,      $result .= &Apache::lonselstudent::render_student_list( $current_members,
      "current",       "current",
      \%defaultUsers,       \%defaultUsers,
      $self->{'multichoice'},       $self->{'multichoice'},
Line 2719  sub render { Line 2368  sub render {
   
  # And future.   # And future.
   
  $result .= &render_student_list( $future_members,   $result .= &Apache::lonselstudent::render_student_list( $future_members,
  "future",   "future",
  \%defaultUsers,   \%defaultUsers,
  $self->{'multichoice'},   $self->{'multichoice'},
Line 2727  sub render { Line 2376  sub render {
  0);   0);
  # Past    # Past 
   
  $result .= &render_student_list($expired_members,   $result .= &Apache::lonselstudent::render_student_list($expired_members,
  "past",   "past",
  \%defaultUsers,   \%defaultUsers,
  $self->{'multichoice'},   $self->{'multichoice'},

Removed from v.1.147  
changed lines
  Added in v.1.148


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