--- loncom/interface/lonhelper.pm 2006/04/24 23:20:37 1.138 +++ loncom/interface/lonhelper.pm 2006/05/09 18:15:39 1.143 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.138 2006/04/24 23:20:37 albertel Exp $ +# $Id: lonhelper.pm,v 1.143 2006/05/09 18:15:39 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -184,6 +184,7 @@ use Apache::lonxml; use Apache::lonlocal; use Apache::lonnet; + # Register all the tags with the helper, so the helper can # push and pop them @@ -2274,6 +2275,120 @@ use strict; use Apache::lonlocal; use Apache::lonnet; +# +# Utility function used when rendering the 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. +# Returns: +# HTML text to add to the rendering of the helper. +# +sub render_student_list { + my ($self, + $sections, $students, $formprefix, $defaultusers) = @_; + + my $multiselect = $self->{'multichoice'}; + 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 .= ''; + $result .= '
'; + + my $size = scalar(keys(%$sections)); + $size += 3; # We have allstudents allpersonel nosection too. + if ($size > 5) { + $size = 5; + } + $result .= ''; + $result .= '
'; + } + + # Now we list the students, but the form element type + # will depend on whether or not multiselect is true. + # True -> checkboxes. + # False -> radiobuttons. + + $result .= "\n"; + $result .= ''."\n"; + $result .= ' '."\n"; + $result .= ' '."\n"; + $result .= ' '."\n"; + $result .= ' '."\n"; + + my $input_type; + if ($multiselect) { + $input_type = "checkbox"; + } else { + $input_type = "radio"; + } + + my $checked = 0; + for my $student (@$students) { + $result .= ''."\n"; + } + $result .="
NameSectionStatusRoleUsername : Domain
[0]; + + # Figure out which students are checked by default... + + if(%$defaultusers) { + if (exists ($defaultusers->{$user})) { + $result .= ' checked ="checked" '; + $checked = 1; + } + } elsif (!$self->{'multichoice'} && !$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, "<>&\"'") + ."\" />\n"; + $result .= HTML::Entities::encode($student->[1], '<>&"') + . ''."\n"; + $result .= HTML::Entities::encode($student->[2], '<>&"') + . ''."\n"; + $result .= HTML::Entities::encode($student->[3], '<>&"') + . ''."\n"; + $result .= HTML::Entities::encode($student->[4], '<>&"') + . ''."\n"; + $result .= HTML::Entities::encode($student->[0], '<>&"') + . '


\n"; + + return $result; +} + BEGIN { &Apache::lonhelper::register('Apache::lonhelper::student', ('student')); @@ -2322,82 +2437,105 @@ sub render { $result = < // SCRIPT @@ -2422,9 +2560,9 @@ SCRIPT
BUTTONS - $result .= $buttons; +# $result .= $buttons; - } +} if (defined $self->{ERROR_MSG}) { $result .= '' . $self->{ERROR_MSG} . '

'; @@ -2442,8 +2580,28 @@ BUTTONS %defaultUsers = map { if ($_) {($_,1) } } @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 if ($self->{'coursepersonnel'}) { @@ -2460,16 +2618,12 @@ BUTTONS @people = sort { $a->[0] cmp $b->[0] } @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 my $classlist = &Apache::loncoursedata::get_classlist(); @@ -2481,164 +2635,90 @@ BUTTONS } 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 = '\n"; + - # Build a table without any borders to contain the section based - # selection: - my $section_selectors =< - - For Sections:$choice_widget - - - - - - - - -
-SECTIONSELECT - $result .= $section_selectors; - } - # username, fullname, section, type 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 'Active') { - push @$choices, [$_, $classlist->{$_}->[$fullname], + push @$current_members, [$_, $classlist->{$_}->[$fullname], $classlist->{$_}->[$section], $classlist->{$_}->[$status], 'Student']; } else { - push @$expired_students, [$_, $classlist->{$_}->[$fullname], - $classlist->{$_}->[$section], - $classlist->{$_}->[$status], 'Student']; + # 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"]; + } + } } - my $name = $self->{'coursepersonnel'} ? &mt('Name') : &mt('Student Name'); - my $type = 'radio'; - if ($self->{'multichoice'}) { $type = 'checkbox'; } - $result .= "\n"; - $result .= "". - "" . - "" . - "" . - ""; - 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) { - $result .= "\n\n\n\n"; + my %sections; + for my $key (@keys) { + my $section_name = $classlist->{$key}->[$section]; + if ($section_name ne "") { + $sections{$section_name} = 1; + } } - $result .= "
$name" . &mt('Section') . "".&mt('Status')."" . &mt("Role") . "".&mt('Username').":".&mt('Domain')."
[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], "<>&\"'") - . "' />" - . HTML::Entities::encode($choice->[1],'<>&"') - . "" - . HTML::Entities::encode($choice->[2],'<>&"') - . "" - . HTML::Entities::encode($choice->[3],'<>&"') - . "" - . HTML::Entities::encode($choice->[4],'<>&"') - . "" - . HTML::Entities::encode($choice->[0],'<>&"') - . "
\n\n"; + + + if ($self->{'multichoice'}) { + + # 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 $result = '\n"; + + + } + + # Current personel + + $result .= $self->render_student_list(\%sections, + $current_members, + "current", + \%defaultUsers); + # If activeonly is not set then we can also give the expired students: # - if (!$self->{'activeonly'} && ((scalar @$expired_students) > 0)) { - $result .= "

Inactive students:

\n"; - $result .= < - - - - - -INACTIVEBUTTONS - $result .= "\n"; - - for my $choice (@$expired_students) { - $result .= "\n\n\n\n"; - } - $result .= "
[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], "<>&\"'") - . "' />" - . HTML::Entities::encode($choice->[1],'<>&"') - . "" - . HTML::Entities::encode($choice->[2],'<>&"') - . "" - . HTML::Entities::encode($choice->[3],'<>&"') - . "" - . HTML::Entities::encode($choice->[4],'<>&"') - . "" - . HTML::Entities::encode($choice->[0],'<>&"') - . "
\n"; - + if (!$self->{'activeonly'} && ((scalar @$expired_members) > 0)) { + + # And future. + + $result .= $self->render_student_list(\%sections, + $future_members, + "future", + \%defaultUsers); + # Past + + $result .= $self->render_student_list(\%sections, + $expired_members, + "past", + \%defaultUsers); } @@ -3082,26 +3162,29 @@ sub start_section { my $section = Apache::loncoursedata::CL_SECTION(); my $classlist = Apache::loncoursedata::get_classlist(); - foreach (keys %$classlist) { - my $sectionName = $classlist->{$_}->[$section]; - if (!$sectionName) { + foreach my $user (keys(%$classlist)) { + my $section_name = $classlist->{$user}[$section]; + if (!$section_name) { $choices{"No section assigned"} = ""; } else { - $choices{$sectionName} = $sectionName; + $choices{$section_name} = $section_name; } } - for my $sectionName (sort(keys(%choices))) { - push @{$paramHash->{CHOICES}}, [$sectionName, $sectionName]; + 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))) { + push @{$paramHash->{CHOICES}}, [$section_name, $section_name]; } return if ($token->[2]{'onlysections'}); # add in groups to the end of the list - my %curr_groups; - if (&Apache::loncommon::coursegroups(\%curr_groups)) { - foreach my $group_name (sort(keys(%curr_groups))) { - push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); - } + my %curr_groups = &Apache::loncommon::coursegroups(); + foreach my $group_name (sort(keys(%curr_groups))) { + push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); } } @@ -3163,11 +3246,9 @@ sub start_group { # Populate the CHOICES element my %choices; - my %curr_groups; - if (&Apache::loncommon::coursegroups(\%curr_groups)) { - foreach my $group_name (sort(keys(%curr_groups))) { - push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); - } + my %curr_groups = &Apache::loncommon::coursegroups(); + foreach my $group_name (sort {lc($a) cmp lc($b)} (keys(%curr_groups))) { + push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); } }