Diff for /loncom/interface/lonhelper.pm between versions 1.178 and 1.203

version 1.178, 2010/01/26 11:34:47 version 1.203, 2022/06/11 14:51:49
Line 64  messages, resource selections, or date q Line 64  messages, resource selections, or date q
   
 The helper tag is required to have one attribute, "title", which is the name  The helper tag is required to have one attribute, "title", which is the name
 of the helper itself, such as "Parameter helper". The helper tag may optionally  of the helper itself, such as "Parameter helper". The helper tag may optionally
 have a "requiredpriv" attribute, specifying the priviledge a user must have  have a "requiredpriv" attribute, specifying the privilege a user must have
 to use the helper, or get denied access. See loncom/auth/rolesplain.tab for  to use the helper, or get denied access. See loncom/auth/rolesplain.tab for
 useful privs. Default is full access, which is often wrong!  useful privs. You may add the modifier &S at the end of the three letter priv
   if you want to grant access to users for whom the corresponding privilege is 
   section-specific. The default is full access, which is often wrong!
   
 =head2 State tags  =head2 State tags
   
Line 261  sub real_handler { Line 263  sub real_handler {
     my $uri = shift;      my $uri = shift;
     if (!defined($uri)) { $uri = $r->uri(); }      if (!defined($uri)) { $uri = $r->uri(); }
     $env{'request.uri'} = $uri;      $env{'request.uri'} = $uri;
     my $filename = '/home/httpd/html' . $uri;      my $filename = $r->dir_config('lonDocRoot').$uri;
     my $fh = Apache::File->new($filename);      my $fh = Apache::File->new($filename);
     my $file;      my $file;
     read $fh, $file, 100000000;      read $fh, $file, 100000000;
Line 283  sub real_handler { Line 285  sub real_handler {
   
     my $allowed = $helper->allowedCheck();      my $allowed = $helper->allowedCheck();
     if (!$allowed) {      if (!$allowed) {
         $env{'user.error.msg'} = $env{'request.uri'}.':'.$helper->{REQUIRED_PRIV}.          my ($priv,$modifier) = split(/\&/,$helper->{REQUIRED_PRIV});
           $env{'user.error.msg'} = $env{'request.uri'}.':'.$priv.
             ":0:0:Permission denied to access this helper.";              ":0:0:Permission denied to access this helper.";
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
Line 508  sub allowedCheck { Line 511  sub allowedCheck {
     if (!defined($self->{REQUIRED_PRIV})) {       if (!defined($self->{REQUIRED_PRIV})) { 
         return 1;          return 1;
     }      }
       my ($priv,$modifier) = split(/\&/,$self->{REQUIRED_PRIV});
     return Apache::lonnet::allowed($self->{REQUIRED_PRIV}, $env{'request.course.id'});      my $allowed = &Apache::lonnet::allowed($priv,$env{'request.course.id'});
       if ((!$allowed) && ($modifier eq 'S') && ($env{'request.course.sec'} ne '')) {
           $allowed = &Apache::lonnet::allowed($priv,$env{'request.course.id'}.'/'.
                                                     $env{'request.course.sec'});
       }
       return $allowed;
 }  }
   
 sub changeState {  sub changeState {
Line 571  sub process { Line 579  sub process {
 # 4: Render the current state to the screen as an HTML page.  # 4: Render the current state to the screen as an HTML page.
 sub display {  sub display {
     my $self = shift;      my $self = shift;
       my $footer = shift;
     my $state = $self->{STATES}{$self->{STATE}};      my $state = $self->{STATES}{$self->{STATE}};
   
     my $result = "";      my $result = "";
Line 606  sub display { Line 614  sub display {
     # FIXME: This should be parameterized, not concatenated - Jeremy      # FIXME: This should be parameterized, not concatenated - Jeremy
   
   
     if (!$state->overrideForm()) { $result.='<form name="helpform" method="post">'; }      if (!$state->overrideForm()) { $result.='<form name="helpform" method="post" action="">'; }
     if ($stateHelp) {      if ($stateHelp) {
         $stateHelp = &Apache::loncommon::help_open_topic($stateHelp);          $stateHelp = &Apache::loncommon::help_open_topic($stateHelp);
     }      }
Line 651  sub display { Line 659  sub display {
     $result .= $buttons;      $result .= $buttons;
   
   
     #foreach my $key (keys %{$self->{VARS}}) {      #foreach my $key (keys(%{$self->{VARS}})) {
     #    $result .= "|$key| -> " . $self->{VARS}->{$key} . "<br />";      #    $result .= "|$key| -> " . $self->{VARS}->{$key} . "<br />";
     #}      #}
   
Line 661  sub display { Line 669  sub display {
         </form>          </form>
 FOOTER  FOOTER
   
     $result .= &Apache::loncommon::end_page();      $result .= $footer.&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 1476  BUTTONS Line 1484  BUTTONS
             HTML::Entities::encode($choice->[1],"<>&\"'")               HTML::Entities::encode($choice->[1],"<>&\"'") 
             . "'";              . "'";
         if ($checkedChoices{$choice->[1]}) {          if ($checkedChoices{$choice->[1]}) {
             $result .= " checked='checked' ";              $result .= " checked='checked'";
         }          }
         $result .= qq{id="id$id"};          $result .= qq{ id="id$id"};
         my $choiceLabel = $choice->[0];          my $choiceLabel = $choice->[0];
         if ($choice->[3]) {  # 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;" .
Line 1486  BUTTONS Line 1494  BUTTONS
             $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>";      $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="'
Line 1792  sub render { Line 1800  sub render {
  if (lc($time) eq 'anytime') {   if (lc($time) eq 'anytime') {
     $anytime=1;      $anytime=1;
     $date = &get_date_object(time);      $date = &get_date_object(time);
     $date->min(0);              $date->set_minute(0);
  } elsif (defined($time) && $time ne 0) {   } elsif (defined($time) && $time ne 0) {
     $date = &get_date_object($time);      $date = &get_date_object($time);
  } else {   } else {
Line 1802  sub render { Line 1810  sub render {
   
     if (!defined($date)) {      if (!defined($date)) {
  $date = &get_date_object(time);   $date = &get_date_object(time);
  $date->min(0);          $date->set_minute(0);
     }      }
   
     if ($anytime) {      if ($anytime) {
Line 1913  CHECK Line 1921  CHECK
  if ($anytime) {   if ($anytime) {
     $result.=' checked="checked" '      $result.=' checked="checked" '
  }   }
  $result.="name='${var}anytime'/>".&mt('Any time').'</label>'          my $anytimetext = &mt('Any time');
           if (($var eq 'startreserve') || ($var eq 'endreserve')) {
               $anytimetext = &mt('Any time before slot starts');
           } elsif (($var eq 'startunique') || ($var eq 'endunique')) {
               $anytimetext = &mt('No restriction on uniqueness');     
           }
    $result.="name='${var}anytime'/>".$anytimetext.'</label>'
     }      }
     return $result;      return $result;
   
Line 2033  be filtered out. The 'addstatus' attribu Line 2047  be filtered out. The 'addstatus' attribu
 and long status display columns to the display. The 'addparts'  and long status display columns to the display. The 'addparts'
 attribute will add in a part selector beside problems that have more  attribute will add in a part selector beside problems that have more
 than 1 part. The 'includecourse' attribute if true, will include  than 1 part. The 'includecourse' attribute if true, will include
 the toplevel default.sequence in the results.  the toplevel default.sequence in the results. The 'modalLink' attribute,
   if true, will cause links to be launched as modal pop-ups, instead of 
   replacing the resource selection listing, currently being displayed. 
   
 =head3 SUB-TAGS  =head3 SUB-TAGS
   
Line 2145  sub start_resource { Line 2161  sub start_resource {
     $paramHash->{'toponly'} = $token->[2]{'toponly'};      $paramHash->{'toponly'} = $token->[2]{'toponly'};
     $paramHash->{'addstatus'} = $token->[2]{'addstatus'};      $paramHash->{'addstatus'} = $token->[2]{'addstatus'};
     $paramHash->{'addparts'} = $token->[2]{'addparts'};      $paramHash->{'addparts'} = $token->[2]{'addparts'};
       $paramHash->{'modalLink'} = $token->[2]{'modallink'};
       $paramHash->{'nocurrloc'} = $token->[2]{'nocurrloc'};
       $paramHash->{'suppressNavmap'} = $token->[2]{'suppressNavmap'};
     if ($paramHash->{'addparts'}) {      if ($paramHash->{'addparts'}) {
  $helper->declareVar($paramHash->{'variable'}.'_part');   $helper->declareVar($paramHash->{'variable'}.'_part');
     }      }
Line 2351  BUTTONS Line 2370  BUTTONS
     my $option_texts   = $self->{OPTION_TEXTS};      my $option_texts   = $self->{OPTION_TEXTS};
     my $option_types   = $self->{OPTION_TYPES};      my $option_types   = $self->{OPTION_TYPES};
     my $addparts       = $self->{'addparts'};      my $addparts       = $self->{'addparts'};
       my $modalLink      = $self->{'modalLink'};
     my $headings_done  = 0;      my $headings_done  = 0;
   
     # Evaluate the map url as needed      # Evaluate the map url as needed
Line 2390  BUTTONS Line 2410  BUTTONS
     $result .= "<th>$text</th>";      $result .= "<th>$text</th>";
  }   }
     }      }
     $result .= "<th>Select</th>";      $result .= '<th>'.&Apache::lonlocal::mt('Select').'</th>';
     $result .= "</tr><tr>"; # Close off the extra row and start a new one.      $result .= "</tr><tr>"; # Close off the extra row and start a new one.
     $headings_done = 1;      $headings_done = 1;
  }   }
Line 2450  BUTTONS Line 2470  BUTTONS
     $resource_name . "'/> </td>";      $resource_name . "'/> </td>";
     } else {      } else {
  $col .=    $col .= 
     "<td align='center'><input type=$option_type name ='$option_var".      "<td align='center'><input type='$option_type' name ='$option_var".
     "_forminput' value='".      "_forminput' value='".
     $resource_name . "' $checked /> </td>";      $resource_name . "' $checked /> </td>";
     }      }
Line 2487  BUTTONS Line 2507  BUTTONS
     &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\">".&Apache::lonlocal::mt('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\">".&Apache::lonlocal::mt('Part: [_1]',$part)."</option>\n";
     }      }
     $col .= "</select>";      $col .= "</select>";
  }   }
Line 2534  RADIO Line 2554  RADIO
        'closeAllPages' => $self->{'closeallpages'},         'closeAllPages' => $self->{'closeallpages'},
                                        'suppressEmptySequences' => $self->{'suppressEmptySequences'},                                         'suppressEmptySequences' => $self->{'suppressEmptySequences'},
        'include_top_level_map' => $self->{'include_top_level_map'},         'include_top_level_map' => $self->{'include_top_level_map'},
                                        'iterator_map' => $mapUrl }                                         'iterator_map' => $mapUrl,
                                          'map_no_edit_link' => 1,
                                          'modalLink' => $modalLink,
                                          'nocurrloc' => $self->{'nocurrloc'},
                                          'suppressNavmap' => $self->{'suppressNavmap'}, }
                                        );                                         );
   
     $result .= $buttons;      $result .= $buttons;
Line 2606  selection. Defaults to false. Line 2630  selection. Defaults to false.
 If true, only active students and course personnel will be  If true, only active students and course personnel will be
 shown. Defaults to false.  shown. Defaults to false.
   
   =item * B<sectiononly>:
   
   If true, and user's role is in a specific section, only course personnel 
   will be shown if they also have a section-specific role in the same section.
   Defaults to false.
   
 =item * B<emptyallowed>:  =item * B<emptyallowed>:
   
 If true, the selection of no users is allowed. Defaults to false.  If true, the selection of no users is allowed. Defaults to false.
Line 2641  sub start_student { Line 2671  sub start_student {
     $helper->declareVar($paramHash->{'variable'});      $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};      $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
     $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'};      $paramHash->{'coursepersonnel'} = $token->[2]{'coursepersonnel'};
       $paramHash->{'sectiononly'} = $token->[2]{'sectiononly'};
     $paramHash->{'activeonly'} = $token->[2]{'activeonly'};      $paramHash->{'activeonly'} = $token->[2]{'activeonly'};
     if (defined($token->[2]{'nextstate'})) {      if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};          $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
Line 2682  sub render { Line 2713  sub render {
  delete($defaultUsers{''});   delete($defaultUsers{''});
     }      }
   
       my $personnel_section;
       if ($self->{'sectiononly'}) {
           $personnel_section = $env{'request.course.sec'};
       }
   
     my ($course_personnel,       my ($course_personnel, 
  $current_members,    $current_members, 
  $expired_members,    $expired_members, 
  $future_members) =    $future_members) = 
     &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'});      &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'},
                                                   $personnel_section);
   
   
     # Load up the non-students, if necessary      # Load up the non-students, if necessary
   
Line 2697  sub render { Line 2731  sub render {
  unshift @$current_members, (@$course_personnel);   unshift @$current_members, (@$course_personnel);
     }      }
   
       my %titles = &Apache::lonlocal::texthash(
                      'active'  => 'Select Currently Enrolled Students and Active Course Personnel',
                      'future'  => 'Select Future Enrolled Students',
                      'expired' => 'Select Previously Enrolled Students',
                    );
   
       if ($env{'request.course.sec'}) {
           if ($self->{'sectiononly'}) {
               $titles{'active'} = &mt('Select Currently Enrolled Students and Active Course Personnel in Section: [_1]',
                                   $env{'request.course.sec'});
           } else {
               $titles{'active'} = &mt('Select Currently Enrolled Students in Section: [_1], and Active Course Personnel',
                                       $env{'request.course.sec'});
           }
           $titles{'future'} = &mt('Select Future Enrolled Students in Section: [_1]',
                                   $env{'request.course.sec'});
           $titles{'expired'} = &mt('Select Previously Enrolled Students in Section: [_1]',
                                    $env{'request.course.sec'});
       }
   
     #   Current personel      #   Current personnel
   
     $result .= '<h4>'.&mt('Select Currently Enrolled Students and Active Course Personnel').'</h4>';      $result .= '<h4>'.$titles{'active'}.'</h4>';
     $result .= &Apache::lonselstudent::render_student_list( $current_members,      $result .= &Apache::lonselstudent::render_student_list( $current_members,
     "helpform",      "helpform",
     "current",       "current",
     \%defaultUsers,      \%defaultUsers,
     $self->{'multichoice'},      $self->{'multichoice'},
     $self->{'variable'},      $self->{'variable'},
     1);      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(@$future_members)) > 0)) {      if (!$self->{'activeonly'} && ((scalar(@$future_members)) > 0)) {
   
  # And future.   # And future.
   
  $result .= '<h4>'.&mt('Select Future Enrolled Students and Future Course Personnel').'</h4>';   $result .= '<h4>'.$titles{'future'}.'</h4>';
                 
  $result .= &Apache::lonselstudent::render_student_list( $future_members,   $result .= &Apache::lonselstudent::render_student_list( $future_members,
  "helpform",   "helpform",
Line 2729  sub render { Line 2781  sub render {
     if (!$self->{'activeonly'} && ((scalar(@$expired_members)) > 0)) {      if (!$self->{'activeonly'} && ((scalar(@$expired_members)) > 0)) {
  # Past    # Past 
   
  $result .= '<h4>'.&mt('Select Previously Enrolled Students and Inactive Course Personnel').'</h4>';   $result .= '<h4>'.$titles{'expired'}.'</h4>';
  $result .= &Apache::lonselstudent::render_student_list($expired_members,   $result .= &Apache::lonselstudent::render_student_list($expired_members,
        "helpform",         "helpform",
        "past",         "past",
Line 2971  BUTTONS Line 3023  BUTTONS
     }      }
   
     # Get the list of files in this directory.      # Get the list of files in this directory.
     my @fileList;      my (@fileList,$listref,$listerror);
   
     # If the subdirectory is in local CSTR space      # If the subdirectory is in local CSTR space
     my $metadir;      my $metadir;
     if ($subdir =~ m|/home/([^/]+)/public_html/(.*)|) {      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
  my ($user,$domain)=       if ($subdir =~ m{^(?:\Q$londocroot\E)*/priv/[^/]+/[^/]+/(.*)$}) {
     &Apache::loncacc::constructaccess($subdir,          my $innerpath=$1;
      $Apache::lonnet::perlvar{'lonDefDomain'});          unless ($subdir=~m{^\Q$londocroot\E}) {
  $metadir='/res/'.$domain.'/'.$user.'/'.$2;             $subdir=$londocroot.$subdir;
         @fileList = &Apache::lonnet::dirlist($subdir,$domain,$user,undef,undef,'/');          }
     } elsif ($subdir =~ m|^~([^/]+)/(.*)$|) {  
  $subdir='/home/'.$1.'/public_html/'.$2;  
  my ($user,$domain)=    my ($user,$domain)= 
     &Apache::loncacc::constructaccess($subdir,      &Apache::lonnet::constructaccess($subdir);
      $Apache::lonnet::perlvar{'lonDefDomain'});   $metadir='/res/'.$domain.'/'.$user.'/'.$innerpath;
  $metadir='/res/'.$domain.'/'.$user.'/'.$2;          ($listref,$listerror) =
         @fileList = &Apache::lonnet::dirlist($subdir,$domain,$user,undef,undef,'/');              &Apache::lonnet::dirlist($subdir,$domain,$user,undef,undef,'/');
     } else {      } else {
         # local library server resource space          # local library server resource space
         @fileList = &Apache::lonnet::dirlist($subdir,$env{'user.domain'},$env{'user.name'},undef,undef,'/');          ($listref,$listerror) = 
               &Apache::lonnet::dirlist($subdir,$env{'user.domain'},$env{'user.name'},undef,undef,'/');
     }      }
   
     # Sort the fileList into order      # Sort the fileList into order
     @fileList = sort {lc($a) cmp lc($b)} @fileList;      if (ref($listref) eq 'ARRAY') {
           @fileList = sort {lc($a) cmp lc($b)} @{$listref};
       }
   
     $result .= $buttons;      $result .= $buttons;
   
Line 3089  sub fileState { Line 3142  sub fileState {
     }      }
     my $docroot = $Apache::lonnet::perlvar{'lonDocRoot'};      my $docroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     my $subdirpart = $constructionSpaceDir;      my $subdirpart = $constructionSpaceDir;
     $subdirpart =~ s/^\/home\/$uname\/public_html//;      $subdirpart =~ s{^\Q$docroot/priv/$udom/$uname\E}{};
     my $resdir = $docroot . '/res/' . $udom . '/' . $uname .      my $resdir = $docroot . '/res/' . $udom . '/' . $uname .
         $subdirpart;          $subdirpart;
   
Line 3139  It takes the standard attributes "variab Line 3192  It takes the standard attributes "variab
 "allowempty" and "nextstate", meaning what they do for most other  "allowempty" and "nextstate", meaning what they do for most other
 elements.  elements.
   
 also takes a boolean 'onlysections' whcih will restrict this to only  also takes a boolean 'onlysections' which will restrict this to only
 have sections and not include groups  have sections and not include groups
   
 =cut  =cut
Line 3177  sub start_section { Line 3230  sub start_section {
   
     # Populate the CHOICES element      # Populate the CHOICES element
     my %choices;      my %choices;
       my $usersec = $Apache::lonnet::env{'request.course.sec'};
   
     my $section = Apache::loncoursedata::CL_SECTION();      if ($usersec ne '') {
     my $classlist = Apache::loncoursedata::get_classlist();          $choices{$usersec} = $usersec;
     foreach my $user (keys(%$classlist)) {      } else {
         my $section_name = $classlist->{$user}[$section];          my $section = Apache::loncoursedata::CL_SECTION();
         if (!$section_name) {          my $classlist = Apache::loncoursedata::get_classlist();
             $choices{"No section assigned"} = "";          foreach my $user (keys(%$classlist)) {
         } else {              my $section_name = $classlist->{$user}[$section];
             $choices{$section_name} = $section_name;              if (!$section_name) {
                   $choices{"No section assigned"} = "";
               } else {
                   $choices{$section_name} = $section_name;
               }
           }
    
           if (exists($choices{"No section assigned"})) {
       push(@{$paramHash->{CHOICES}}, 
            ['No section assigned','No section assigned']);
       delete($choices{"No section assigned"});
         }          }
     }   
      
     if (exists($choices{"No section assigned"})) {  
  push(@{$paramHash->{CHOICES}},   
      ['No section assigned','No section assigned']);  
  delete($choices{"No section assigned"});  
     }      }
     for my $section_name (sort {lc($a) cmp lc($b) } (keys(%choices))) {      for my $section_name (sort {lc($a) cmp lc($b) } (keys(%choices))) {
  push @{$paramHash->{CHOICES}}, [$section_name, $section_name];   push @{$paramHash->{CHOICES}}, [$section_name, $section_name];
Line 3228  It takes the standard attributes "variab Line 3286  It takes the standard attributes "variab
  "allowempty" and "nextstate", meaning what they do for most other   "allowempty" and "nextstate", meaning what they do for most other
  elements.   elements.
   
   also takes a boolean grouponly, which if true, will restrict choice to
   groups in which user is a member, unless user has the mdg priv in the course,
   in which case all groups will be possible choices. Defaults to false.
   
 =cut  =cut
   
 no strict;  no strict;
Line 3257  sub start_group { Line 3319  sub start_group {
     $helper->declareVar($paramHash->{'variable'});      $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};      $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
     $paramHash->{'allowempty'} = $token->[2]{'allowempty'};      $paramHash->{'allowempty'} = $token->[2]{'allowempty'};
       $paramHash->{'grouponly'} = $token->[2]{'grouponly'};
     if (defined($token->[2]{'nextstate'})) {      if (defined($token->[2]{'nextstate'})) {
         $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};          $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'};
     }      }
Line 3264  sub start_group { Line 3327  sub start_group {
     # Populate the CHOICES element      # Populate the CHOICES element
     my %choices;      my %choices;
   
     my %curr_groups = &Apache::longroup::coursegroups();      my %curr_groups;
       if ((!$paramHash->{'grouponly'}) || (&Apache::lonnet::allowed('mdg',$Apache::lonnet::env{'request.course.id'}))) {
           %curr_groups = &Apache::longroup::coursegroups();
       } elsif ($Apache::lonnet::env{'request.course.groups'} ne '') {
           map { $curr_groups{$_} = 1; } split(/:/,$Apache::lonnet::env{'request.course.groups'});
       }
     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 3289  package Apache::lonhelper::string; Line 3357  package Apache::lonhelper::string;
 string elements provide a string entry field for the user. string elements  string elements provide a string entry field for the user. string elements
 take the usual 'variable' and 'nextstate' parameters. string elements  take the usual 'variable' and 'nextstate' parameters. string elements
 also pass through 'maxlength' and 'size' attributes to the input tag.  also pass through 'maxlength' and 'size' attributes to the input tag.
   Since you could have multiple strings in a helper state, each with its own
   validator, all but the last string should have
   noproceed='1' so that _all_ validators are evaluated before the next
   state can be reached.
   
 string honors the defaultvalue tag, if given.  string honors the defaultvalue tag, if given.
   
Line 3308  BEGIN { Line 3380  BEGIN {
   
 sub new {  sub new {
     my $ref = Apache::lonhelper::element->new();      my $ref = Apache::lonhelper::element->new();
       $ref->{'PROCEED'} = 1;      # By default postprocess goes to next state.
     bless($ref);      bless($ref);
 }  }
   
Line 3324  sub start_string { Line 3397  sub start_string {
     $paramHash->{'nextstate'} = $token->[2]{'nextstate'};      $paramHash->{'nextstate'} = $token->[2]{'nextstate'};
     $paramHash->{'maxlength'} = $token->[2]{'maxlength'};      $paramHash->{'maxlength'} = $token->[2]{'maxlength'};
     $paramHash->{'size'} = $token->[2]{'size'};      $paramHash->{'size'} = $token->[2]{'size'};
   
     return '';      return '';
 }  }
   
 sub end_string {  sub end_string {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
   
     if ($target ne 'helper') {      if ($target ne 'helper') {
         return '';          return '';
     }      }
     Apache::lonhelper::string->new();      my $state = Apache::lonhelper::string->new();
   
   
       if(&Apache::lonxml::get_param('noproceed', $parstack, $safeeval, undef, 1)) {
    $state->noproceed();
       }
   
      
   
     return '';      return '';
 }  }
   
   sub noproceed() {
       my $self = shift;
       $self->{PROCEED}  = 0;
   }
   
 sub render {  sub render {
     my $self = shift;      my $self = shift;
     my $result = '';      my $result = '';
Line 3346  sub render { Line 3432  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="text" name="' . $self->{'variable'} . '_forminput"';
   
     if (defined($self->{'size'})) {      if (defined($self->{'size'})) {
         $result .= ' size="' . $self->{'size'} . '"';          $result .= ' size="' . $self->{'size'} . '"';
Line 3381  sub postprocess { Line 3467  sub postprocess {
  }   }
     }      }
   
     if (defined($self->{'nextstate'})) {      if (defined($self->{'nextstate'}) && $self->{PROCEED}) {
         $helper->changeState($self->{'nextstate'});          $helper->changeState($self->{'nextstate'});
     }      }
   
Line 3608  sub render { Line 3694  sub render {
     my @results;      my @results;
   
     # Collect all the results      # Collect all the results
     for my $stateName (keys %{$helper->{STATES}}) {      for my $stateName (keys(%{$helper->{STATES}})) {
         my $state = $helper->{STATES}->{$stateName};          my $state = $helper->{STATES}->{$stateName};
                   
         for my $element (@{$state->{ELEMENTS}}) {          for my $element (@{$state->{ELEMENTS}}) {
Line 3661  sub render { Line 3747  sub render {
     }      }
     my $previous = HTML::Entities::encode(&mt("Back"), '<>&"');      my $previous = HTML::Entities::encode(&mt("Back"), '<>&"');
     my $next = HTML::Entities::encode(&mt("Next"), '<>&"');      my $next = HTML::Entities::encode(&mt("Next"), '<>&"');
     my $target = " target='loncapaclient'";  
     if ($env{'environment.remote'} eq 'off') {  $target='';  }  
     $result .= "<p>\n" .      $result .= "<p>\n" .
  "<form action='".$actionURL."' method='post' $target>\n" .   "<form action='".$actionURL."' method='post' >\n" .
  "<input type='button' onclick='history.go(-1)' value='$previous' />" .   "<input type='button' onclick='history.go(-1)' value='$previous' />" .
  "<input type='hidden' name='orgurl' value='$targetURL' />" .   "<input type='hidden' name='orgurl' value='$targetURL' />" .
  "<input type='hidden' name='selectrole' value='1' />\n" .   "<input type='hidden' name='selectrole' value='1' />\n" .
Line 3751  sub render { Line 3835  sub render {
     if ($vars->{GRANULARITY} eq 'whole_course') {      if ($vars->{GRANULARITY} eq 'whole_course') {
         $resourceString .= '<li>'.&mt('for [_1]all resources in the course[_2]','<b>','</b>').'</li>';          $resourceString .= '<li>'.&mt('for [_1]all resources in the course[_2]','<b>','</b>').'</li>';
  if ($vars->{TARGETS} eq 'course') {   if ($vars->{TARGETS} eq 'course') {
     $level = 14; # general course, see lonparmset.pm perldoc      $level = 18; # general course, see lonparmset.pm perldoc
  } elsif ($vars->{TARGETS} eq 'section') {   } elsif ($vars->{TARGETS} eq 'section') {
     $level = 9;      $level = 12;
  } elsif ($vars->{TARGETS} eq 'group') {   } elsif ($vars->{TARGETS} eq 'group') {
     $level = 6;      $level = 8;
  } else {   } else {
     $level = 3;      $level = 4;
  }   }
         $affectedResourceId = "0.0";          $affectedResourceId = "0.0";
         $symb = 'a';          $symb = 'a';
         $paramlevel = 'general';          $paramlevel = 'general';
     } elsif ($vars->{GRANULARITY} eq 'map') {      } elsif (($vars->{GRANULARITY} eq 'map') || ($vars->{GRANULARITY} eq 'maprecurse')) {
         my $navmap = Apache::lonnavmaps::navmap->new();          my $navmap = Apache::lonnavmaps::navmap->new();
         if (defined($navmap)) {          if (defined($navmap)) {
              my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});               my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
              my $title = $res->compTitle();               my $title = $res->compTitle();
              $symb = $res->symb();               $symb = $res->symb();
              $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';               if ($vars->{GRANULARITY} eq 'map') {
                    $resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>';
                } else {
                    $resourceString .= '<li>'.&mt('for the map named [_1] (applies recursively to sub-folders)',"<b>$title</b>").'</li>';
                }
         } else {          } else {
             $resourceString .= '<li>'.&mt('for the map ID [_1] (name unavailable)','<b>'.$vars->{RESOURCE_ID}.'</b>').'</li>';              $resourceString .= '<li>'.&mt('for the map ID [_1] (name unavailable)','<b>'.$vars->{RESOURCE_ID}.'</b>').'</li>';
             &Apache::lonnet::logthis('Retrieval of map title failed in lonhelper.pm - could not create navmap object for course.');              &Apache::lonnet::logthis('Retrieval of map title failed in lonhelper.pm - could not create navmap object for course.');
   
         }          }
  if ($vars->{TARGETS} eq 'course') {          if ($vars->{GRANULARITY} eq 'maprecurse') {
     $level = 13; # general course, see lonparmset.pm perldoc              if ($vars->{TARGETS} eq 'course') {
  } elsif ($vars->{TARGETS} eq 'section') {                  $level = 17; # general course, see lonparmset.pm perldoc
     $level = 8;              } elsif ($vars->{TARGETS} eq 'section') {
  } elsif ($vars->{TARGETS} eq 'group') {                  $level = 11;
     $level = 5;              } elsif ($vars->{TARGETS} eq 'group') {
  } else {                  $level = 7;
     $level = 2;              } else {
  }                  $level = 3;
               }
           } else {
       if ($vars->{TARGETS} eq 'course') {
           $level = 16; # general course, see lonparmset.pm perldoc
       } elsif ($vars->{TARGETS} eq 'section') {
           $level = 10;
       } elsif ($vars->{TARGETS} eq 'group') {
           $level = 6;
       } else {
           $level = 2;
       }
           }
         $affectedResourceId = $vars->{RESOURCE_ID};          $affectedResourceId = $vars->{RESOURCE_ID};
         $paramlevel = 'map';          $paramlevel = 'map';
     } else {      } else {
Line 3799  sub render { Line 3899  sub render {
             &Apache::lonnet::logthis('Retrieval of resource title failed in lonhelper.pm - could not create navmap object for course.');              &Apache::lonnet::logthis('Retrieval of resource title failed in lonhelper.pm - could not create navmap object for course.');
         }          }
  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 = 7;      $level = 9;
  } elsif ($vars->{TARGETS} eq 'group') {   } elsif ($vars->{TARGETS} eq 'group') {
     $level = 4;      $level = 5;
  } else {   } else {
     $level = 1;      $level = 1;
  }   }
Line 3819  sub render { Line 3919  sub render {
     if ($vars->{GRANULARITY} eq 'resource') {      if ($vars->{GRANULARITY} eq 'resource') {
  $result .= "<input type='hidden' name='symb' value='".   $result .= "<input type='hidden' name='symb' value='".
     HTML::Entities::encode($symb,"'<>&\"") . "' />\n";      HTML::Entities::encode($symb,"'<>&\"") . "' />\n";
     } elsif ($vars->{GRANULARITY} eq 'map') {      } elsif (($vars->{GRANULARITY} eq 'map') || ($vars->{GRANULARITY} eq 'maprecurse')) {
  $result .= "<input type='hidden' name='pschp' value='".   $result .= "<input type='hidden' name='pschp' value='".
     $affectedResourceId."' />\n";      $affectedResourceId."' />\n";
     }      }

Removed from v.1.178  
changed lines
  Added in v.1.203


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