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

raeburn lon-capa-cvs-allow@mail.lon-capa.org
Thu, 29 May 2008 04:29:33 -0000


This is a MIME encoded message

--raeburn1212035373
Content-Type: text/plain

raeburn		Thu May 29 00:29:33 2008 EDT

  Modified files:              
    /loncom/interface	coursecatalog.pm 
  Log:
  Display available course categories.
  - Either self-cataloguing scheme for "official courses" based on course code
    (up to four coupled dynamic select boxes available,e.g., Year, Semester, Department,
    Number - if localenroll::instcode_format() customized
  - or categories defined by Domain Coordination in Domain Configuration Menu
  - or both.      
  
  
--raeburn1212035373
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20080529002933.txt"

Index: loncom/interface/coursecatalog.pm
diff -u loncom/interface/coursecatalog.pm:1.27 loncom/interface/coursecatalog.pm:1.28
--- loncom/interface/coursecatalog.pm:1.27	Fri Mar  7 23:00:53 2008
+++ loncom/interface/coursecatalog.pm	Thu May 29 00:29:33 2008
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler for displaying the course catalog interface
 #
-# $Id: coursecatalog.pm,v 1.27 2008/03/08 04:00:53 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.28 2008/05/29 04:29:33 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -54,7 +54,8 @@
     &Apache::lonacc::get_posted_cgi($r);
     &Apache::lonlocal::get_language_handle($r);
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
-    my $codedom = &Apache::lonnet::default_login_domain(); 
+
+    my $codedom = &Apache::lonnet::default_login_domain();
 
     if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) { 
         $codedom = $env{'user.domain'};
@@ -63,15 +64,40 @@
         }
     }
     my $formname = 'coursecatalog';
+    if ($env{'form.showdom'} ne '') {
+        if (&Apache::lonnet::domain($env{'form.showdom'}) ne '') {
+            $codedom = $env{'form.showdom'};
+        }
+    }
     my $domdesc = &Apache::lonnet::domain($codedom,'description');
-
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($env{'form.coursenum'} ne '' && &user_is_known()) {
         &course_details($r,$codedom,$formname,$domdesc);
     } else {
-        my $numtitles = &course_selector($r,$codedom,$formname,$domdesc);
-        if ($env{'form.state'} eq 'listing') {
-            $r->print(&print_course_listing($codedom,$numtitles).'<br />');
+        my $catlinks = &category_breadcrumbs($codedom);
+        my $catjs = <<"ENDSCRIPT";
+
+function setCatDepth(depth) {
+    document.coursecats.catalog_maxdepth.value = depth;
+    document.coursecats.submit();
+    return;
+}
+
+ENDSCRIPT
+        my $numtitles;
+        if ($env{'form.currcat_0'} eq 'instcode::0') {
+            $numtitles = &instcode_course_selector($r,$codedom,$formname,$domdesc,
+                                                   $catlinks,$catjs);
+            if ($env{'form.state'} eq 'listing') {
+                $r->print(&print_course_listing($codedom,$numtitles));
+            }
+        } else {
+            my (%add_entries);
+            $catjs = '<script type="text/javascript">'."\n".$catjs."\n".'</script>';
+            &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks);
+            if ($env{'form.currcat_0'} ne '') {
+                $r->print(&print_course_listing($codedom));
+            }
         }
     }
     $r->print(&Apache::loncommon::end_page());
@@ -100,7 +126,7 @@
              {text=>"Course details"});
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details'));
     $r->print('<br />'.&mt('Detailed course information:').'<br /><br />'.
-              '<form name="coursecatalog" method="post">'.
+              '<form name="'.$formname.'" method="post">'.
               &print_course_listing($codedom).'<br /><br />');
     $r->print('<a href = "javascript:document.coursecatalog.submit()">'.
               &mt('Back to course listing').'</a>'.
@@ -109,8 +135,8 @@
               '<input type="hidden" name="state" value="listing" /></form>');
 }
 
-sub course_selector {
-    my ($r,$codedom,$formname,$domdesc) = @_;
+sub instcode_course_selector {
+    my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs) = @_;
     my %coursecodes = ();
     my %codes = ();
     my @codetitles = ();
@@ -195,40 +221,21 @@
 }\n|;
             }
         }
-        my $js = '<script type"text/javascript">'."\n$jscript\n".
+        my $js = '<script type"text/javascript">'."\n$jscript\n$catjs\n".
                  '</script>';
         my %add_entries = (topmargin    => "0",
                            marginheight => "0",);
         if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) {
             $add_entries{'onLoad'} = 'setElements()';
         }
-        my $start_page =
-            &Apache::loncommon::start_page('Course Catalog',$js,
-                                           {
-                                             'add_entries' => \%add_entries,
-                                             'no_inline_link'   => 1,});
-        $r->print($start_page);
-        if ($env{'form.state'} eq 'listing') {
-            if ($numtitles > 0) {
-                &Apache::lonhtmlcommon::add_breadcrumb
-                ({href=>"/adm/coursecatalog",
-                  text=>"Select courses"},
-                 {text=>"Course listing"});
-            } else {
-                &Apache::lonhtmlcommon::add_breadcrumb
-                ({text=>"Course listing"});
-            }
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Listing'));
-        } else {
-            &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>"/adm/coursecatalog",
-              text=>"Select courses"});
-            $r->print(&Apache::lonhtmlcommon::breadcrumbs('Select courses'));
-        }
-        $r->print('<h3>'.&mt('Display information about official [_1] classes for which LON-CAPA courses have been created:',$domdesc).'</h3>');
-        $r->print('<form name="coursecatalog" method="post">');
+        &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles);
+        my $cat_maxdepth = $env{'form.catalog_maxdepth'};
+        $r->print('<form name="'.$formname.'" method="post" action="/adm/coursecatalog">'.
+                  '<input type="hidden" name="catalog_maxdepth" value="'.$cat_maxdepth.'" />'.
+                  '<input type="hidden" name="showdom" value="'.$env{'form.showdom'}.'" />'.
+                  '<input type="hidden" name="currcat_0" value="instcode::0" />');
         if ($numtitles > 0) {
-            $r->print(&mt('<b>Choose which course(s) to list.</b><br />'));
+            $r->print('<br /><b>'.&mt('Choose which course(s) to list.').'</b><br />');
             $r->print('<table><tr>');
             for (my $k=0; $k<$lasttitle-1; $k++) {
                 my (@items,@unsorted);
@@ -281,24 +288,147 @@
             }
             $r->print('<br />');
         }
-        $r->print('<input type="hidden" name="coursenum" value="" /><input type="hidden" name="sortby" value="" /><input type="hidden" name="state" value="listing" />');
+        $r->print('<input type="hidden" name="coursenum" value="" /><input type="hidden" name="sortby" value="" /><input type="hidden" name="state" value="listing" /><input type="hidden" name="form.currcat_0" value="instcode::0" />');
         if ($numtitles > 0) {
             $r->print('<input type="submit" name="catalogfilter" value="'.&mt('Display courses').'" />');
         }
         $r->print('<input type="hidden" name="numtitles" value="'.
                   $numtitles.'" /></form>');
         if (($numtitles > 0) && ($env{'form.state'} eq 'listing')) {
-            $r->print('<br /><br />');
+            $r->print('<br />');
         }
     } else {
-        $r->print(&Apache::loncommon::start_page('Course Catalog','',
-                  {
-                   'no_inline_link'   => 1,}));
         $r->print('<br />'.&mt('No official courses to display for [_1].',$domdesc));
     }
     return $numtitles;
 }
 
+sub cat_header {
+    my ($r,$codedom,$js,$add_entries,$catlinks,$numtitles) = @_;
+    my $start_page =
+        &Apache::loncommon::start_page('Course Catalog',$js,
+                                       {
+                                         'add_entries' => $add_entries,
+                                         'no_inline_link'   => 1,});
+    $r->print($start_page);
+    if ($env{'form.state'} eq 'listing') {
+        if ($numtitles > 0) {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>"/adm/coursecatalog",
+                  text=>"Select courses"},
+                 {text=>"Course listing"});
+        } else {
+            &Apache::lonhtmlcommon::add_breadcrumb
+            ({text=>"Course listing"});
+        }
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Listing'));
+    } else {
+        &Apache::lonhtmlcommon::add_breadcrumb
+        ({href=>"/adm/coursecatalog",
+          text=>"Select courses"});
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs('Select courses'));
+    }
+    $r->print('<table border="0"><tr>'.
+              '<form name="coursecatdom" method="post" action="/adm/coursecatalog">'.
+              '<td><b>'.&mt('Domain:').'</b></td><td>'.
+              &Apache::loncommon::select_dom_form($codedom,'showdom','',1).
+	      '&nbsp;<input type="submit" name="godom" value="Go"></td></form></tr><tr>'.
+	      '<form name="coursecats" method="post" action="/adm/coursecatalog">'.
+              $catlinks.'</form></tr></table>');
+    return;
+}
+
+sub category_breadcrumbs {
+    my ($dom) = @_;
+    my %domconfig =
+        &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);
+    my (@cats,@trails,%allitems,%idx,@jsarray);
+    &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@cats,\@trails,
+                                           \%allitems,\%idx,\@jsarray);
+    my $currdepth = 0;
+    my $deeper = 0;
+    my $currcat_str;
+    if ($env{'form.catalog_maxdepth'} ne '') {
+        $currdepth = $env{'form.catalog_maxdepth'};
+        $deeper = $currdepth + 1;
+    }
+    $currcat_str = '<input type="hidden" name="catalog_maxdepth" value="'.$deeper.'" /><input type="hidden" name="showdom" value="'.$dom.'" />';
+    my $catlinks = '<td valign="top"><b>'.&mt('Catalog:').'</b></td><td><table><tr>';
+    for (my $i=0; $i<$deeper; $i++) {
+        $currcat_str .= '<input type="hidden" name="currcat_'.$i.'" value="'.$env{'form.currcat_'.$i}.'" />';
+        my ($cattitle,$shallower);
+        if ($i == 0) {
+            $cattitle = &mt('Main Categories');
+        } else {
+            $shallower = $i-1;
+            my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$env{'form.currcat_'.$shallower});
+            $cattitle = $cat;
+        }
+        $catlinks .= '<td valign="top"><a href="javascript:setCatDepth('."'$shallower'".')">'.$cattitle.'</a>-&gt;</td>';
+    }
+    if ($deeper == 0) {
+        $catlinks .= '<td>'.&mt('Main Categories').':&nbsp;';
+        if (ref($cats[0]) eq 'ARRAY') {
+            if ((@{$cats[0]} == 1) && ($cats[0][0] eq 'instcode')) {
+                $catlinks .= &mt('Official courses (with institutional codes)').
+                             '<input type="hidden" name="currcat_0" value="instcode::0">';
+                $env{'form.currcat_0'} = 'instcode::0';
+            } else {
+                $catlinks .= '<select name="currcat_0">'."\n";
+                if (@{$cats[0]} > 1) {
+                    my $selstr;
+                    if ($env{'form.currcat_0'} eq '') {
+                        $selstr = ' selected="selected" ';
+                    }
+                    $catlinks .= '<option value=""'.$selstr.'>'.&mt('Select').'</option>'."\n";
+                }
+                for (my $i=0; $i<@{$cats[0]}; $i++) {
+                    my $name = $cats[0][$i];
+                    my $item = &escape($name).'::0';
+                    my $selstr;
+                    if ($env{'form.currcat_'.$i} eq $item) {
+                        $selstr = ' selected="selected" ';
+                    }
+                    $catlinks .= '<option value="'.$item.'"'.$selstr.'>';
+                    if ($name eq 'instcode') {
+                        $catlinks .= &mt('Official courses (with institutional codes)');
+                    } else {
+                        $catlinks .= $name;
+                    }
+                    $catlinks .= '</option>'."\n";
+                }
+                $catlinks .= '</select>'."\n".
+                             '&nbsp;<input type="submit" name="gocats" value="Go" />';
+            }
+        } else {
+            $catlinks .= &mt('Official courses (with institutional codes)').
+                         '<input type="hidden" name="currcat_0" value="instcode::0">';
+            $env{'form.currcat_0'} = 'instcode::0';
+        }
+    } else {
+        my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$env{'form.currcat_'.$currdepth});
+        my $deeper = $depth +1;
+        my $currcat = $cat;
+        if ($cat eq 'instcode') {
+            $currcat = &mt('Official courses (with institutional codes)');
+        }
+        $catlinks .= '<td>'.$currcat;
+        if (ref($cats[$deeper]{$cat}) eq 'ARRAY') {
+            $catlinks .= ':&nbsp;<select name="currcat_'.$deeper.'">'.
+                         '<option value="" selected="selected">'.&mt('Select').'</option>';
+            for (my $k=0; $k<@{$cats[$deeper]{$cat}}; $k++) {
+                my $name = $cats[$deeper]{$cat}[$k];
+                my $item = &escape($name).':'.&escape($cat).':'.$deeper;
+                $catlinks .= '<option value="'.$item.'">'.$name.'</option>'."\n";
+            }
+            $catlinks .= '</select>'."\n".
+                         '&nbsp;<input type="submit" name="gocats" value="Go" />';
+        }
+    }
+    $catlinks .= $currcat_str.'</td></tr></table></td>';
+    return $catlinks;
+}
+
 sub user_is_dc {
     my ($codedom) = @_;
     if (exists($env{'user.role.dc./'.$codedom.'/'})) {
@@ -395,7 +525,7 @@
     return $output;
 }
 
-sub search_courselist {
+sub search_official_courselist {
     my ($domain,$numtitles) = @_;
     my $instcode;
     if (defined($numtitles) && $numtitles == 0) {
@@ -425,6 +555,18 @@
     return %courses;
 }
 
+sub search_courselist {
+    my ($domain) = @_;
+    my $cat_maxdepth = $env{'form.catalog_maxdepth'};
+    my $filter = $env{'form.currcat_'.$cat_maxdepth};
+    my %courses;
+    if ($filter ne '') {
+        %courses = &Apache::lonnet::courseiddump($domain,'.',1,'.','.','.',
+                                                 undef,undef,'Course',1,
+                                                 $env{'form.showselfenroll'},$filter);
+    }
+    return %courses;
+}
 
 sub print_course_listing {
     my ($domain,$numtitles) = @_;
@@ -446,7 +588,11 @@
             return $output;
         }
     } else {
-        %courses = &search_courselist($domain,$numtitles);
+        if ($env{'form.currcat_0'} eq 'instcode::0') {
+            %courses = &search_official_courselist($domain,$numtitles);
+        } else {
+            %courses = &search_courselist($domain);
+        }
         if (keys(%courses) == 0) {
             $output = &mt('No courses match the criteria you selected.');
             return $output;

--raeburn1212035373--