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

raeburn lon-capa-cvs@mail.lon-capa.org
Thu, 12 Oct 2006 23:15:34 -0000


This is a MIME encoded message

--raeburn1160694934
Content-Type: text/plain

raeburn		Thu Oct 12 19:15:34 2006 EDT

  Modified files:              
    /loncom/interface	coursecatalog.pm 
  Log:
  Using routines from courseclassifier instead of lonsupportreq. All ipossible values are now displayed in select boxes for Year, Semester and Department.  Options available in "Number" select box are set dynamically if a specific Department is selected.  Choices will vary depending on current selections for Year and Semester.        
  
  
--raeburn1160694934
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20061012191534.txt"

Index: loncom/interface/coursecatalog.pm
diff -u loncom/interface/coursecatalog.pm:1.5 loncom/interface/coursecatalog.pm:1.6
--- loncom/interface/coursecatalog.pm:1.5	Sun Sep 24 20:16:56 2006
+++ loncom/interface/coursecatalog.pm	Thu Oct 12 19:15:33 2006
@@ -30,7 +30,7 @@
 use Apache::loncommon;
 use Apache::lonnet;
 use Apache::lonlocal;
-use Apache::lonsupportreq;
+use Apache::courseclassifier;
 use Apache::lonacc;
 use lib '/home/httpd/lib/perl/';
 use LONCAPA;
@@ -46,7 +46,6 @@
     &Apache::lonlocal::get_language_handle($r);
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
     my $codedom = $Apache::lonnet::perlvar{'lonDefDomain'};
-    my $ccode = '';
     my %coursecodes = ();
     my %codes = ();
     my @codetitles = ();
@@ -55,27 +54,44 @@
     my %idlist = ();
     my %idnums = ();
     my %idlist_titles = ();
+    my %by_year;
+    my %by_sem;
+    my %by_dept;
+    my %cat_items;
     my $caller = 'global';
     my $format_reply;
     my $totcodes = 0;
     my $jscript = '';
+    my ($numtitles,$lasttitle);
     my $formname = 'coursecatalog';
     my $domdesc = $Apache::lonnet::domaindescription{$codedom};
-    $totcodes = &Apache::lonsupportreq::retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
+    $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
     if ($totcodes > 0) {
-        if ($ccode eq '') {
-            $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order);
-            if ($format_reply eq 'ok') {
-                my $numtypes = @codetitles;
-                &Apache::lonsupportreq::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
-                &Apache::lonsupportreq::javascript_code_selections($formname,$numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles);
+        $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order);
+        if ($format_reply eq 'ok') {
+            my $numtypes = @codetitles;
+            &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
+            my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles);
+            my $longtitles_str = join('","',@{$longtitles});
+            my $allidlist = $idlist{$codetitles[0]};
+            $numtitles = @codetitles;
+            $lasttitle = $numtitles;
+            if ($numtitles > 4) {
+                $lasttitle = 4;
             }
+            my @data = ('top');
+            for (my $k=0; $k<$lasttitle; $k++) {
+                my $cat = $codetitles[$k];
+                my $level = 1;
+                $level = &recurse_options($codetitles[$k],$idlist{$codetitles[$k]},$level,$cat,\%cat_items,\@data,\%by_year,\%by_sem,\%by_dept);        }
+            $scripttext .= &build_javascript(\%by_year,\%by_sem,\%by_dept,\%cat_order,\@codetitles);
+            $jscript .= &javascript_select_filler($formname,$scripttext,\@codetitles,$longtitles_str,$allidlist);
         }
         if ($env{'form.state'} eq 'listing') {
             $jscript .= '
 function setElements() {
 ';
-            for (my $i=0; $i<@codetitles; $i++) {
+            for (my $i=0; $i<@codetitles-1; $i++) {
                 if ($env{'form.'.$codetitles[$i]} != -1) {
                     $jscript .= '
     for (var j=0; j<document.'.$formname.'.'.$codetitles[$i].'.length; j++) {
@@ -84,11 +100,18 @@
         }
     }
 ';
-                    $jscript .= '  courseSet('."'$codetitles[$i]'".');'."\n";
-                } else {
-                    last;
                 }
             }
+            $jscript .= '   courseSet()'."\n";
+            if ($env{'form.'.$codetitles[-1]} != -1) {
+                $jscript .= '
+    for (var j=0; j<document.'.$formname.'.'.$codetitles[-1].'.length; j++) {
+        if (document.'.$formname.'.'.$codetitles[-1].'[j].value == "'.$env{'form.'.$codetitles[-1]}.'") {
+            document.'.$formname.'.'.$codetitles[-1].'.selectedIndex = j;
+        }
+    }
+';
+            }
             $jscript .= '}';
             $jscript .= qq|
 function changeSort(caller) {
@@ -108,58 +131,44 @@
                                              'no_inline_link'   => 1,});
         $r->print($start_page);
 
-        my $numtitles = @codetitles;
         $r->print('<h3>'.&mt('Display information about official [_1] classes for which LON-CAPA courses have been created:',$domdesc).'</h3>');
         $r->print(&mt('<b>Choose which course(s) to list.</b><br />'));
         $r->print('<form name="coursecatalog" method="post">'); 
         if ($numtitles > 0) {
-            my $lasttitle = $numtitles;
-            if ($numtitles > 4) {
-                $lasttitle = 4;
-            }
-            $r->print('<table><tr><td>'.$codetitles[0].'<br />'."\n".
-                  '<select name="'.$codetitles[0].'" onChange="courseSet('."'$codetitles[0]'".')">'."\n".
-                  ' <option value="-1" />Select'."\n");
-            my @items = ();
-            my @longitems = ();
-            if ($idlist{$codetitles[0]} =~ /","/) {
-                @items = split(/","/,$idlist{$codetitles[0]});
-            } else {
-                $items[0] = $idlist{$codetitles[0]};
-            }
-            if (defined($idlist_titles{$codetitles[0]})) {
-                if ($idlist_titles{$codetitles[0]} =~ /","/) {
-                    @longitems = split(/","/,$idlist_titles{$codetitles[0]});
+            $r->print('<table><tr>');
+            for (my $k=0; $k<$lasttitle-1; $k++) {
+                my @unsorted = @{$cat_items{$codetitles[$k]}};
+                my @items;
+                &Apache::courseclassifier::sort_cats($k,\%cat_order,\@codetitles,\@unsorted,\@items);
+                my @longitems;
+                if (defined($cat_titles{$codetitles[$k]})) {
+                    foreach my $item (@items) {
+                        push(@longitems,$cat_titles{$codetitles[$k]}{$item});
+                    }
                 } else {
-                    $longitems[0] = $idlist_titles{$codetitles[0]};
+                    @longitems = @items;
                 }
-                for (my $i=0; $i<@longitems; $i++) {
+                $r->print('<td align="center">'.$codetitles[$k].'<br />'."\n".
+                          '<select name="'.$codetitles[$k].'" onChange="courseSet()"');
+                $r->print('>'."\n".'<option value="0" />All'."\n");
+                for (my $i=0; $i<@items; $i++) {
                     if ($longitems[$i] eq '') {
                         $longitems[$i] = $items[$i];
                     }
+                    $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
                 }
-            } else {
-                @longitems = @items;
+                $r->print('</select></td>');
             }
-            for (my $i=0; $i<@items; $i++) {
-                $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
-            }
-            $r->print('</select></td>');
-            for (my $i=1; $i<$numtitles; $i++) {
-                $r->print('<td>'.$codetitles[$i].'<br />'."\n".
-                 '<select name="'.$codetitles[$i].'" onChange="courseSet('."'$codetitles[$i]'".')">'."\n".
-                 '<option value="-1">&lt;-Pick '.$codetitles[$i-1].'</option>'."\n".
-                 '</select>'."\n".
+            $r->print('<td align="center">'.$codetitles[$lasttitle-1].'<br />'."\n".
+                      '<select name="'.$codetitles[$lasttitle-1].'">'."\n".
+                      '<option value="0">All'."\n".
+                      '</option>'."\n".'</select>'."\n".
                  '</td>'
                 );
-            }
             $r->print('</tr></table>');
             if ($numtitles > 4) {
-                $r->print('<br /><br />'.$codetitles[$numtitles].'<br />'."\n".
-                    '<select name="'.$codetitles[$numtitles].
-                    '" onChange="courseSet('."'$codetitles[$numtitles]'".')">'."\n".
-                    '<option value="-1">&lt;-Pick '.$codetitles[$numtitles-1].
-                    '</option>'."\n".'</select>'."\n");
+                $r->print('<br /><br />'.$codetitles[$numtitles-1].'<br />'."\n".
+                '<input type="text" name="'.$codetitles[$numtitles-1].'" /><br />'."\n");
             }
         }
         $r->print('<br /><input type="hidden" name="state" value="listing" /><input type="hidden" name="sortby" value="" /><input type="submit" name="catalogfilter" value="'.&mt('Display courses').'" /></form>');
@@ -170,12 +179,96 @@
         $r->print('<br />'.&mt('No official courses to display for [_1].',$domdesc));
     }
     if ($env{'form.state'} eq 'listing') {
-        $r->print('<br /><br />'.&print_course_listing($codedom));
+        $r->print('<br /><br />'.&print_course_listing($codedom).'<br />');
     }
     $r->print(&Apache::loncommon::end_page());
     return OK;
 }
 
+sub recurse_options {
+    my ($currkey,$currlist,$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept) = @_;
+    if (ref($currlist) eq 'HASH') {
+        $level ++;
+        foreach my $key (sort(keys(%{$currlist}))) {
+            $$data[$level-1]= $key;
+            &recurse_options($key,$currlist->{$key},$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept);
+        }
+    } else {
+        $level --;
+        my @contents = split(/","/,$currlist);
+        foreach my $item (@contents) {
+            if (!grep(/^\Q$item\E$/,@{$cat_options->{$cat}})) {
+                push(@{$cat_options->{$cat}},$item);
+            }
+            if ($level == 3) {
+                if (!grep/^\Q$item\E$/,@{$by_year->{$data->[1]}->{$currkey}}) {
+                    push(@{$by_year->{$data->[1]}->{$currkey}},$item);                 
+                }
+                if (!grep/^\Q$item\E$/,@{$by_sem->{$data->[2]}->{$currkey}}) {
+                    push(@{$by_sem->{$data->[2]}->{$currkey}},$item);
+                }
+                if (!grep/^\Q$item\E$/,@{$by_dept->{$currkey}}) {
+                    push(@{$by_dept->{$currkey}},$item);
+                }
+
+            }
+        }
+    }
+    return $level;
+}
+
+sub build_javascript {
+    my ($by_year,$by_sem,$by_dept,$cat_order,$codetitles) = @_;
+    my @unsorted = keys(%{$by_year});
+    my @sorted_yrs; 
+    &Apache::courseclassifier::sort_cats('0',$cat_order,$codetitles,\@unsorted,\@sorted_yrs);
+    my $output = 'var idcse_by_yr_year = new Array("'.join('","',@sorted_yrs).'");'."\n".
+                 'var idcse_by_yr_dept = new Array('.scalar(@sorted_yrs).');'."\n".
+                 'var idcse_by_yr_num = new Array('.scalar(@sorted_yrs).');'."\n";
+    for (my $i=0; $i<@sorted_yrs; $i++) {
+        my $numkeys = keys(%{$by_year->{$sorted_yrs[$i]}});
+        $output .= " idcse_by_yr_num[$i] = new Array($numkeys);\n";
+        if (ref($by_year->{$sorted_yrs[$i]}) eq 'HASH') {
+            @unsorted = keys(%{$by_year->{$sorted_yrs[$i]}});
+            my @sorted_depts;
+            &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_depts);
+            $output .= qq| idcse_by_yr_dept[$i] = new Array ("|.join('","',@sorted_depts).'");'."\n";
+            for (my $j=0; $j<@sorted_depts; $j++) {
+                $output .= qq| idcse_by_yr_num[$i][$j] = new Array ("|;
+                $output .= join('","',sort(@{$by_year->{$sorted_yrs[$i]}->{$sorted_depts[$j]}})).'");'."\n";
+            }
+        }
+    }
+    @unsorted = keys(%{$by_sem});
+    my @sorted_sems;
+    &Apache::courseclassifier::sort_cats('1',$cat_order,$codetitles,\@unsorted,\@sorted_sems);
+    $output .=  'idcse_by_sem_sems = new Array("'.join('","',@sorted_sems).'");'."\n".
+                'idcse_by_sem_dept = new Array('.scalar(@sorted_sems).');'."\n".
+                'idcse_by_sem_num = new Array('.scalar(@sorted_sems).');'."\n";
+    for (my $i=0; $i<@sorted_sems; $i++) {
+        my $numkeys = keys(%{$by_sem->{$sorted_sems[$i]}});
+        $output .= " idcse_by_sem_num[$i] = new Array($numkeys);\n";
+        if (ref($by_sem->{$sorted_sems[$i]}) eq 'HASH') {
+            @unsorted = keys(%{$by_sem->{$sorted_sems[$i]}});
+            my @sorted_depts;
+            &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_depts);
+            $output .= qq| idcse_by_sem_dept[$i] = new Array("|.join('","',@sorted_depts).'");'."\n";
+            for (my $j=0; $j<@sorted_depts; $j++) {
+                $output .= qq| idcse_by_sem_num[$i][$j] = new Array ("|.join('","',sort(@{$by_sem->{$sorted_sems[$i]}->{$sorted_depts[$j]}})).'");'."\n";
+            }
+        }
+    }
+    @unsorted = keys(%{$by_dept});
+    my @sorted_deps;
+    &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_deps);
+    $output .= 'idcse_by_dep = new Array('.scalar(@sorted_deps).');'."\n"; 
+    for (my $k=0; $k<@sorted_deps; $k++) {
+        $output .= qq| idcse_by_dep[$k] = new Array ("|.join('","',sort(@{$by_dept->{$sorted_deps[$k]}})).'");'."\n";
+    }
+    return $output;
+}
+
+
 sub print_course_listing {
     my ($domain) = @_;
     my $output;
@@ -184,20 +277,26 @@
     my $dept = $env{'form.Department'};
     my $coursenum = $env{'form.Number'};
     my $instcode;
-    if ($sem != -1) {
-        $instcode .= $sem; 
+    if ($sem eq '0' ) {
+        $instcode .= '^[sfu]s';
+    } else {
+        $instcode .= '^'.$sem; 
     }
-    if ($year != -1) {
+    if ($year eq '0') {
+        $instcode .= '\d{2}';
+    } else {
         $instcode .= $year; 
     }
-    if ($dept != -1) {
+    if ($dept eq '0') {
+        $instcode .= '\w{2,3}';
+    } else {
         $instcode .= $dept;
     }
-    if ($coursenum != -1) {
-        $instcode .= $coursenum; 
+    if ($coursenum ne '0' && $coursenum != -1) {
+        $instcode .= $coursenum.'$'; 
     }
     my %courses = &Apache::lonnet::courseiddump($domain,'.',1,$instcode,'.','.',
-                                                undef,undef,'Course');
+                                                undef,undef,'Course',1);
     if (keys(%courses) == 0) {
         $output = &mt('No courses match the criteria you selected.');
         return $output;
@@ -454,6 +553,138 @@
     return $response;
 }
 
+sub javascript_select_filler {
+    my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist) = @_;
+    my $output = <<END;
+function courseSet() {
+    var longtitles = new Array ("$longtitles_str");
+    var valyr = document.$formname.Year.options[document.$formname.Year.selectedIndex].value
+    var valsem  = document.$formname.Semester.options[document.$formname.Semester.selectedIndex].value
+    var valdept = document.$formname.Department.options[document.$formname.Department.selectedIndex].value
+    var valclass = document.$formname.Number.options[document.$formname.Number.selectedIndex].value
+    var idyears = new Array("$allidlist");
+    var idyr = -1;
+    var idsem = -1;
+    var iddept = -1;
+    document.$formname.Number.length = 0;
 
-1;
+    $scripttext
+
+    selYear = document.$formname.Year.selectedIndex-1;
+    selSemester = document.$formname.Semester.selectedIndex-1;
+    selDepartment = document.$formname.Department.selectedIndex-1;
+    if (selYear == -1) {
+        if (selSemester == -1) {
+            if (selDepartment > -1) {
+                document.$formname.Number.options[0] =  new Option('All','0',false,false);
+                for (var k=0; k<idcse_by_dep[selDepartment].length; k++) {
+                    document.$formname.Number.options[k+1] = new Option(idcse_by_dep[selDepartment][k],idcse_by_dep[selDepartment][k],false,false);
 
+                }
+            } 
+            else {
+                document.$formname.Number.options[0] = new Option("All","0",true,true);
+            }
+        }
+        else {
+            if (selDepartment > -1) {
+                for (var i=0; i<idcse_by_sem_sems.length; i++) {
+                    if (idcse_by_sem_sems[i] == valsem) {
+                        idsem = i;
+                    }
+                }
+                if (idsem != -1) {
+                    for (var i=0; i<idcse_by_sem_dept[idsem].length; i++) {
+                        if (idcse_by_sem_dept[idsem][i] == valdept) {
+                            iddept = i;
+                        }
+                    }
+                }
+                if (iddept != -1) {
+                    document.$formname.Number.options[0] =  new Option('All','0',false,false);
+                    for (var k=0; k<idcse_by_sem_num[idsem][iddept].length; k++) {
+                        document.$formname.Number.options[k+1] = new Option(idcse_by_sem_num[idsem][iddept][k],idcse_by_sem_num[idsem][iddept][k],false,false);
+                    }
+                }
+                else {
+                    document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
+                }
+            }
+            else {
+                document.$formname.Number.options[0] = new Option("All","0",true,true);
+            }
+        }
+    }
+    else {
+        if (selSemester == -1) {
+            if (selDepartment > -1) {
+                for (var i=0; i<idcse_by_yr_year.length; i++) {
+                    if (idcse_by_yr_year[i] == valyr) {
+                        idyr = i;
+                    }
+                }
+                if (idyr != -1) {      
+                    for (var i=0; i<idcse_by_yr_dept[idyr].length; i++) {
+                        if (idcse_by_yr_dept[idyr][i] == valdept) {
+                            iddept = i;
+                        }
+                    }
+                }
+                if (iddept != -1) {
+                    document.$formname.Number.options[0] =  new Option('All','0',false,false);
+                    for (var k=0; k<idcse_by_yr_num[idyr][iddept].length; k++) {
+                        document.$formname.Number.options[k+1] = new Option(idcse_by_yr_num[idyr][iddept][k],idcse_by_yr_num[idyr][iddept][k],false,false);
+                    }
+                } 
+                else {
+                    document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
+                }
+            }
+            else {
+                document.$formname.Number.options[0] = new Option("All","0",true,true);
+            }
+        }
+        else {
+            for (var k=0; k<idyears.length; k++) {
+                if (idyears[k] == valyr) {
+                    idyr = k;
+                }
+            }
+            if (idyr != -1) {
+                for (var k=0; k<idsems[idyr].length; k++) {
+                    if (idsems[idyr][k] == valsem) {
+                        idsem = k;
+                    }
+                }
+            }
+            if (idsem != -1) {
+                for (var k=0; k<idcodes[idyr][idsem].length; k++) {
+                    if (idcodes[idyr][idsem][k] == valdept) {
+                        iddept = k;
+                    }
+                }
+            }
+            if (iddept != -1) {
+                document.$formname.Number.options[0] =  new Option('All','0',false,false);
+                for (var i=0; i<idcourses[idyr][idsem][iddept].length; i++) {
+                    var display = idcourses[idyr][idsem][iddept][i];
+                    if (longtitles[3] == 1) {
+                        if (idcourseslongs[idyr][idsem][iddept][i] != "") {
+                            display = idcourseslongs[idyr][idsem][iddept][i]
+                        }
+                    }
+                    document.$formname.Number.options[i+1] = new Option(display,idcourses[idyr][idsem][iddept][i],false,false)
+                }
+            }
+            else {
+                document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
+            }
+        }
+        document.$formname.Number.selectedIndex = 0
+    }
+}
+END
+    return $output;
+}
+
+1;

--raeburn1160694934--