[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstathelpers.pm

matthew lon-capa-cvs@mail.lon-capa.org
Wed, 15 Sep 2004 21:07:34 -0000


matthew		Wed Sep 15 17:07:34 2004 EDT

  Modified files:              
    /loncom/interface/statistics	lonstathelpers.pm 
  Log:
  Added &MultipleProblemSelector, modified &get_target_from_id to work
  with array ref input instead of (only) scalar input.
  
  
Index: loncom/interface/statistics/lonstathelpers.pm
diff -u loncom/interface/statistics/lonstathelpers.pm:1.20 loncom/interface/statistics/lonstathelpers.pm:1.21
--- loncom/interface/statistics/lonstathelpers.pm:1.20	Wed Aug 25 13:23:06 2004
+++ loncom/interface/statistics/lonstathelpers.pm	Wed Sep 15 17:07:34 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstathelpers.pm,v 1.20 2004/08/25 17:23:06 matthew Exp $
+# $Id: lonstathelpers.pm,v 1.21 2004/09/15 21:07:34 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -40,7 +40,6 @@
 
 =head1 OVERVIEW
 
-
 =over 4
 
 =cut
@@ -170,6 +169,161 @@
 
 =pod
 
+=item &MultpleProblemSelector($navmap,$ResponseTypes,$selected,$inputname)
+
+Generate HTML with checkboxes for problem selection.
+
+Input: 
+
+$navmap: a navmap object.  If undef, navmaps will be called to create a
+new object.
+
+$ResponseTypes: scalar containing regular expression which matches response 
+types.  Only those problems which contain the given response type will be 
+shown.
+
+$selected: Scalar, Array, or hash reference of currently selected items.
+
+$inputname: The name of the form elements to use for the checkboxs.
+
+Returns: A string containing html for a table which lists the sequences
+and their contents.  A checkbox is provided for each problem.
+
+=cut
+
+####################################################
+####################################################
+sub MultipleProblemSelector {
+    my ($navmap,$ReponseTypes,$inputname,$formname)=@_;
+    my $cid = $ENV{'request.course.id'};
+    my $Str;
+    # Massage the input as needed.
+    if (! defined($navmap)) {
+        $navmap = Apache::lonnavmaps::navmap->new();
+        if (! defined($navmap)) {
+            $Str .= 
+                '<h1>'.&mt('Error: cannot process course structure').'</h1>';
+            return $Str;
+        }
+    }
+    my $selected = {map { ($_,1) } (&get_selected_symbs($inputname))};
+    # Header
+    $Str .= <<"END";
+<script>
+    function checkall(value, checkName) {
+        for (i=0; i<document.forms.$formname.elements.length; i++) {
+            ele = document.forms.$formname.elements[i];
+            if (ele.name == '$inputname') {
+                document.forms.$formname.elements[i].checked=value;
+            }
+        }
+    }
+</script>
+END
+    $Str .= 
+        '<a href="javascript:checkall(true)">'.&mt('Select All').'</a>'.
+        ('&nbsp;'x4).
+        '<a href="javascript:checkall(false)">'.&mt('Unselect All').'</a>';
+    $Str .= $/.'<table>'.$/;
+    my $iterator = $navmap->getIterator(undef, undef, undef, 1);
+    my $sequence_string;
+    my @Accumulator = (&new_accumulator($ENV{'course.'.$cid.'.description'},
+                                        '',
+                                        '',
+                                        $inputname));
+    my @Sequence_Data;
+    while (my $curRes = $iterator->next()) {
+        if ($curRes == $iterator->END_MAP) {
+            if (ref($Accumulator[-1]) eq 'CODE') {
+                push(@Sequence_Data,&{$Accumulator[-1]}());
+                pop(@Accumulator);
+            }
+        } elsif ($curRes == $iterator->BEGIN_MAP) {
+            # Not much to do here.
+        }
+        next if (! ref($curRes));
+        if ($curRes->is_map) {
+            push(@Accumulator,&new_accumulator($curRes->title,
+                                               $curRes->src,
+                                               $curRes->symb,
+                                               $inputname));
+        } elsif ($curRes->is_problem) {
+            if (@Accumulator && $Accumulator[-1] ne '') {
+                &{$Accumulator[-1]}($curRes,
+                                    exists($selected->{$curRes->symb}));
+            }
+        }
+    }
+    my $course_seq = pop(@Sequence_Data);
+    foreach my $seq ($course_seq,@Sequence_Data) {
+        #my $seq = pop(@Sequence_Data);
+        next if (! defined($seq) || ref($seq) ne 'HASH');
+        $Str.= '<tr><td colspan="2">'.
+            '<b>'.&get_title($seq->{'title'},$seq->{'src'}).'</b>'.
+            '</td></tr>'.$/;
+        $Str.= $seq->{'html'};
+    }
+    $Str .= '</table>'.$/;
+    return $Str;
+}
+
+sub get_title {
+    my ($title,$src) = @_;
+    if ($title eq '') {
+        ($title) = ($src =~ m|/([^/]+)$|);
+    } else {
+        $title =~ s/\&colon;/:/g;
+    }
+    return $title;
+}
+
+sub new_accumulator {
+    my ($title,$src,$symb,$inputname) = @_;
+    my $target;
+    return 
+        sub {
+            if (@_) { 
+                my ($res,$checked) = @_;
+                $target.='<tr><td>'.
+                    '<input type="checkbox" name="'.$inputname.'" ';
+                if ($checked) {
+                    $target .= 'checked ';
+                }
+                $target.= 
+                    'value="'.&Apache::lonnet::escape($res->symb).'" />'.
+                    '</td><td>'.&get_title($res->title,$res->symb).'</td>'.
+                    '</tr>'.$/;
+            } else { 
+                if (defined($target)) {
+                    return { title => $title,
+                             symb  => $symb,
+                             src   => $src,
+                             html  => $target, }; 
+                }
+                return undef;
+            }
+        };
+}
+
+sub get_selected_symbs {
+    my ($inputfield) = @_;
+    my $field = 'form.'.$inputfield;
+    my @Symbs;
+    if (exists($ENV{$field})) {
+        if (! ref($ENV{$field})) {
+            @Symbs = (&Apache::lonnet::unescape($ENV{$field}));
+        } else {
+            @Symbs = (map {&Apache::lonnet::unescape($_);} @{$ENV{$field}});
+        }
+    }
+    return @Symbs;
+}
+
+####################################################
+####################################################
+
+=pod
+
 =item &make_target_id($target)
 
 Inputs: Hash ref with the following entries:
@@ -213,11 +367,23 @@
 ####################################################
 sub get_target_from_id {
     my ($id) = @_;
-    my ($symb,$part,$respid,$resptype) = split(':',$id);
-    return ({ symb    =>&Apache::lonnet::unescape($symb),
-             part     =>&Apache::lonnet::unescape($part),
-             respid   =>&Apache::lonnet::unescape($respid),
-             resptype =>&Apache::lonnet::unescape($resptype)});
+    if (! ref($id)) {
+        my ($symb,$part,$respid,$resptype) = split(':',$id);
+        return ({ symb     => &Apache::lonnet::unescape($symb),
+                  part     => &Apache::lonnet::unescape($part),
+                  respid   => &Apache::lonnet::unescape($respid),
+                  resptype => &Apache::lonnet::unescape($resptype)});
+    } elsif (ref($id) eq 'ARRAY') {
+        my @Return;
+        foreach my $selected (@$id) {
+            my ($symb,$part,$respid,$resptype) = split(':',$selected);
+            push(@Return,{ symb     => &Apache::lonnet::unescape($symb),
+                           part     => &Apache::lonnet::unescape($part),
+                           respid   => &Apache::lonnet::unescape($respid),
+                           resptype => &Apache::lonnet::unescape($resptype)});
+        }
+        return \@Return;
+    }
 }
 
 ####################################################