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

version 1.132, 2006/03/06 23:32:31 version 1.154, 2006/05/30 21:54:22
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::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 361  use Apache::loncommon; Line 364  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 466  sub _saveVars { Line 470  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 573  sub display { Line 576  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 652  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 1072  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 1172  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 1287  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 1334  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 1579  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 1719  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 1766  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 2277  sub render { Line 2321  sub render {
     my $buttons = '';      my $buttons = '';
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
   
     if ($self->{'multichoice'}) {  
         $result = <<SCRIPT;  
 <script type="text/javascript">  
 // <!--  
     function checkall(value, checkName) {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {  
             ele = document.forms.helpform.elements[i];  
             if (ele.name == checkName + '.forminput') {  
                 document.forms.helpform.elements[i].checked=value;  
             }  
         }  
     }  
     function checksec(value) {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {  
     comp = document.forms.helpform.elements.chksec.value;  
             if (document.forms.helpform.elements[i].value.indexOf(':'+comp+':') != -1) {  
  if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) {  
     document.forms.helpform.elements[i].checked=value;  
  }  
             }  
         }  
     }  
     function checkactive() {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {  
             if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) {  
                 document.forms.helpform.elements[i].checked=true;  
             }   
         }  
     }  
     function checkexpired()  {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {  
             if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) {  
                 document.forms.helpform.elements[i].checked=true;  
             }   
         }  
     }  
     function uncheckexpired() {  
  for (i=0; i<document.forms.helpform.elements.length; i++) {  
             if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) {  
                 document.forms.helpform.elements[i].checked=false;  
             }   
         }  
     }  
     function getDesiredState() {     // Return desired person state radio value.  
         numRadio = document.forms.helpform.personstate.length;  
         for (i =0; i < numRadio; i++) {  
     if (document.forms.helpform.personstate[i].checked) {  
                 return document.forms.helpform.personstate[i].value;  
             }  
         }  
         return "";  
     }  
   
     function checksections(value) {    // Check selected sections.  
         numSections  = document.forms.helpform.chosensections.length;  
  desiredState = getDesiredState();  
   
  for (var option = 0; option < numSections; option++) {  
     if(document.forms.helpform.chosensections.options[option].selected) {  
  section = document.forms.helpform.chosensections.options[option].text;  
  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];  
  if (desiredState == hisState ||  
     desiredState == "All") {  
     if(hisSection == section ||  
        section =="" ) {  
  document.forms.helpform.elements[i].checked = value;  
     }  
  }  
     }  
  }  
             }  
  }  
    }  
 // -->  
 </script>  
 SCRIPT  
   
         my %lt=&Apache::lonlocal::texthash(  
                     'ocs'  => "Select Only Current Students",  
                     'ues'  => "Unselect Expired Students",  
                     'sas'  => "Select All Students",  
                     'uas'  => "Unselect All Students",  
                     'sfsg' => "Select Current Students for Section/Group",  
     'ufsg' => "Unselect for Section/Group");  
    
         $buttons = <<BUTTONS;  
 <br />  
 <table>  
     
   <tr>  
      <td><input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" /></td>  
      <td> <input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" /><br /></td>  
   </tr>  
     
 </table>  
 <br />  
 BUTTONS  
     $result .= $buttons;     
   
     }  
   
     if (defined $self->{ERROR_MSG}) {      if (defined $self->{ERROR_MSG}) {
         $result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />';          $result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />';
Line 2401  BUTTONS Line 2338  BUTTONS
  %defaultUsers = map { if ($_) {($_,1) } } @defaultUsers;   %defaultUsers = map { if ($_) {($_,1) } } @defaultUsers;
  delete($defaultUsers{''});   delete($defaultUsers{''});
     }      }
     my $choices = [];  
     my $expired_students = []; # Will hold expired students.  
   
     # Load up the non-students, if necessary  
     if ($self->{'coursepersonnel'}) {  
  my %coursepersonnel = Apache::lonnet::get_course_adv_roles();  
  for (sort keys %coursepersonnel) {  
     for my $role (split /,/, $coursepersonnel{$_}) {  
  # extract the names so we can sort them  
  my @people;  
   
  for (split /,/, $role) {  
     push @people, [split /:/, $role];  
  }  
   
  @people = sort { $a->[0] cmp $b->[0] } @people;  
   
  for my $person (@people) {  
     push @$choices, [join(':', @$person), $person->[0], '', $_];  
  }  
     }  
  }  
     }  
   
     # Constants      my ($course_personnel, 
     my $section = Apache::loncoursedata::CL_SECTION();   $current_members, 
     my $fullname = Apache::loncoursedata::CL_FULLNAME();   $expired_members, 
     my $status = Apache::loncoursedata::CL_STATUS();   $future_members) = 
       &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'});
   
     # Load up the students  
     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;  
     #  
     #  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) {  
   
  # We split the active students into the choices array and      # Load up the non-students, if necessary
         # inactive ones into expired_students so that we can put them in 2 separate  
  # tables.      if ($self->{'coursepersonnel'}) {
    unshift @$current_members, (@$course_personnel);
  if ( $classlist->{$_}->[$status] eq  
     'Active') {  
     push @$choices, [$_, $classlist->{$_}->[$fullname],   
      $classlist->{$_}->[$section],  
      $classlist->{$_}->[$status], 'Student'];  
  } else {  
     push @$expired_students, [$_, $classlist->{$_}->[$fullname],   
       $classlist->{$_}->[$section],  
       $classlist->{$_}->[$status], '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;      #   Current personel
     #  
     # Give the active students and staff:      $result .= &Apache::lonselstudent::render_student_list( $current_members,
     #      "helpform",
     for my $choice (@$choices) {      "current", 
         $result .= "<tr><td><input type='$type' name='" .      \%defaultUsers,
             $self->{'variable'} . '.forminput' . "'";      $self->{'multichoice'},
                   $self->{'variable'},
  if (%defaultUsers) {      1);
     my $user=$choice->[0];  
     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\n";  
   
     # 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 .= &Apache::lonselstudent::render_student_list( $future_members,
                  <td><input type="button" value="Select expired" onclick="checkexpired();" /> </td>   "helpform",
  <td><input type="button" value="Unselect expired" onclick="uncheckexpired();" /></td>   "future",
               </tr>   \%defaultUsers,
            </table>   $self->{'multichoice'},
 INACTIVEBUTTONS   $self->{'variable'},
  $result .= "<table>\n";   0);
    # Past 
  for my $choice (@$expired_students) {  
         $result .= "<tr><td><input type='$type' name='" .   $result .= &Apache::lonselstudent::render_student_list($expired_members,
             $self->{'variable'} . '.forminput' . "'";         "helpform",
                      "past",
  if (%defaultUsers) {         \%defaultUsers,
     my $user=$choice->[0];         $self->{'multichoice'},
     if (exists($defaultUsers{$user})) {         $self->{'variable'},
  $result .= " checked='checked' ";         0);
  $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 2786  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 2821  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 2831  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::longroup::coursegroups();
       foreach my $group_name (sort(keys(%curr_groups))) {
    push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]);
     }      }
 }      }    
   
Line 3067  package Apache::lonhelper::group; Line 2873  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 2907  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 2915  sub start_group {
     # Populate the CHOICES element      # Populate the CHOICES element
     my %choices;      my %choices;
   
     my $numgroups;      my %curr_groups = &Apache::longroup::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 3024  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;
Line 3600  sub render { Line 3403  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 3616  sub render { Line 3421  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 3633  sub render { Line 3440  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.132  
changed lines
  Added in v.1.154


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