--- loncom/interface/coursecatalog.pm 2008/07/07 15:20:18 1.36 +++ loncom/interface/coursecatalog.pm 2009/10/28 17:28:17 1.48.2.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for displaying the course catalog interface # -# $Id: coursecatalog.pm,v 1.36 2008/07/07 15:20:18 raeburn Exp $ +# $Id: coursecatalog.pm,v 1.48.2.2 2009/10/28 17:28:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -53,7 +53,8 @@ sub handler { } &Apache::lonacc::get_posted_cgi($r); &Apache::lonlocal::get_language_handle($r); - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']); + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['sortby','showdom']); my $codedom = &Apache::lonnet::default_login_domain(); @@ -89,7 +90,7 @@ sub handler { if ($env{'form.coursenum'} ne '' && &user_is_known()) { &course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems); } else { - my ($catlinks,$has_subcats) = &category_breadcrumbs($codedom,@cats); + my ($catlinks,$has_subcats,$selitem) = &category_breadcrumbs($codedom,@cats); my $catjs = <<"ENDSCRIPT"; function setCatDepth(depth) { @@ -101,18 +102,18 @@ function setCatDepth(depth) { return; } -ENDSCRIPT - if ($env{'form.state'} eq 'listing') { - $catjs .= qq| function changeSort(caller) { document.$formname.sortby.value = caller; document.$formname.submit(); } + function setCourseId(caller) { document.$formname.coursenum.value = caller; document.$formname.submit(); -}\n|; - } +} + +ENDSCRIPT + $catjs .= &courselink_javascript(); my $numtitles; if ($env{'form.currcat_0'} eq 'instcode::0') { $numtitles = &instcode_course_selector($r,$codedom,$formname,$domdesc, @@ -122,13 +123,27 @@ function setCourseId(caller) { } } else { my (%add_entries); + my ($currdepth,$deeper) = &get_depth_values(); + if ($selitem) { + my $alert = &mt('Choose a subcategory to display'); + if (!$deeper) { + $alert = &mt('Choose a category to display'); + } + $catjs .= <<ENDJS; +function check_selected() { + if (document.coursecats.$selitem.options[document.coursecats.$selitem.selectedIndex].value == "") { + alert('$alert'); + return false; + } +} +ENDJS + } $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('<form name="'.$formname. '" method="post" action="/adm/coursecatalog">'. &additional_filters($codedom,$has_subcats)."\n"); - my ($currdepth,$deeper) = &get_depth_values(); $r->print('<input type="hidden" name="catalog_maxdepth" value="'. $deeper.'" />'."\n"); for (my $i=0; $i<$deeper; $i++) { @@ -156,8 +171,10 @@ sub course_details { my $output; my %add_entries = (topmargin => "0", marginheight => "0",); + my $js = '<script type="text/javascript">'."\n". + &courselink_javascript().'</script>'."\n"; my $start_page = - &Apache::loncommon::start_page('Course Catalog','', + &Apache::loncommon::start_page('Course Catalog',$js, { 'add_entries' => \%add_entries, 'no_inline_link' => 1,}); @@ -173,16 +190,43 @@ sub course_details { {text=>"Course details"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details')); $r->print('<br />'.&mt('Detailed course information:').'<br /><br />'. - '<form name="'.$formname.'" method="post">'. &print_course_listing($codedom,undef,$trails,$allitems). '<br /><br />'); - $r->print('<a href = "javascript:document.coursecatalog.submit()">'. + $r->print('<form name="'.$formname.'" method="post" action="/adm/coursecatalog">'. + '<a href = "javascript:document.coursecatalog.submit()">'. &mt('Back to course listing').'</a>'. - '<input type="hidden" name="sortby" value="'. - $env{'form.sortby'}.'" />'. - '<input type="hidden" name="state" value="listing" /></form>'); + &Apache::lonhtmlcommon::echo_form_input(['coursenum','catalogfilter', + 'showdetails','courseid']).'</form>'); + return; +} + +sub courselink_javascript { + return <<"END"; + +function ToSyllabus(cdom,cnum) { + if (cdom == '' || cdom == null) { + return; + } + if (cnum == '' || cnum == null) { + return; + } + document.linklaunch.action = "/public/"+cdom+"/"+cnum+"/syllabus"; + document.linklaunch.submit(); +} + +function ToSelfenroll(courseid) { + if (courseid == '') { + return; + } + document.linklaunch.action = "/adm/selfenroll"; + document.linklaunch.courseid.value = courseid; + document.linklaunch.submit(); } +END +} + + sub instcode_course_selector { my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs) = @_; my %coursecodes = (); @@ -319,11 +363,9 @@ function setElements() { '<input type="submit" name="catalogfilter" value="'. &mt('Display courses').'" />'. '<input type="hidden" name="numtitles" value="'.$numtitles. - '" /></form>'); - if (($numtitles > 0) && ($env{'form.state'} eq 'listing')) { - $r->print('<br />'); - } + '" /></form><br /><br />'); } else { + $js = '<script type"text/javascript">'."\n$catjs\n".'</script>'; &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">'. @@ -360,49 +402,72 @@ sub cat_header { text=>"Select courses"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Select courses')); } + my $onchange; + unless (($env{'browser.interface'} eq 'textual') || ($env{'form.interface'} eq 'textual')) { + $onchange = 'this.form.submit()'; + } $r->print('<form name="coursecatdom" method="post" action="/adm/coursecatalog">'. '<table border="0"><tr><td><b>'.&mt('Domain:').'</b></td><td>'. - &Apache::loncommon::select_dom_form($codedom,'showdom','',1). - ' <input type="submit" name="godom" value="'.&mt('Change').'" /></td></tr></table></form>'. - '<form name="coursecats" method="post" action="/adm/coursecatalog">'. + &Apache::loncommon::select_dom_form($codedom,'showdom','',1,$onchange)); + if (!$onchange) { + $r->print(' <input type="submit" name="godom" value="'.&mt('Change').'" />'); + } + $r->print('</td></tr></table></form>'. + '<form name="coursecats" method="post" action="/adm/coursecatalog"'. + ' onsubmit="return check_selected();">'. '<table border="0"><tr>'.$catlinks.'</tr></table></form>'); return; } sub category_breadcrumbs { my ($dom,@cats) = @_; + my $crumbsymbol = ' ▶ '; my ($currdepth,$deeper) = &get_depth_values(); my $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>'; my $has_subcats; + my $selitem; 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'); + if (ref($cats[0]) eq 'ARRAY') { + if (@{$cats[0]} > 1) { + $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>-></td>'; + if ($cattitle ne '') { + $catlinks .= '<td valign="top"><a href="javascript:setCatDepth('."'$shallower'".')">'.$cattitle.'</a>'.$crumbsymbol.'</td>'; + } } if ($deeper == 0) { - $catlinks .= '<td>'.&mt('Main Categories').': '; + $catlinks .= '<td>'; 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'; + if ((@{$cats[0]} == 1) && (@cats == 1)) { + if ($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 { + my $name = $cats[0][0]; + my $item = &escape($name).'::0'; + $catlinks .= $name. + '<input type="hidden" name="currcat_0" value="'.$item.'" />'; + $env{'form.currcat_0'} = $item; + } } else { $has_subcats = 1; - $catlinks .= '<select name="currcat_0">'."\n"; + my $buttontext = &mt('Show subcategories'); + $selitem = 'currcat_0'; + $catlinks .= '<select name="'.$selitem.'">'."\n"; if (@{$cats[0]} > 1) { - my $selstr; - if ($env{'form.currcat_0'} eq '') { - $selstr = ' selected="selected" '; - } - $catlinks .= '<option value="" selected="selected">'.&mt('Select').'</option>'."\n"; + $catlinks .= '<option value="" selected="selected">'.&mt('Select').'</option>'."\n"; + $buttontext = &mt('Pick main category'); } for (my $i=0; $i<@{$cats[0]}; $i++) { my $name = $cats[0][$i]; @@ -416,7 +481,8 @@ sub category_breadcrumbs { $catlinks .= '</option>'."\n"; } $catlinks .= '</select>'."\n". - ' <input type="submit" name="gocats" value="'.&mt('Change').'" />'; + ' <input type="submit" name="gocats" value="'. + $buttontext.'" />'; } } else { $catlinks .= &mt('Official courses (with institutional codes)'). @@ -436,24 +502,31 @@ sub category_breadcrumbs { if ($cat eq 'instcode') { $currcat = &mt('Official courses (with institutional codes)'); } - $catlinks .= '<td>'.$currcat; + $catlinks .= '<td><b>'.$currcat.'</b>'; if (ref($cats[$deeper]{$cat}) eq 'ARRAY') { $has_subcats = 1; - my $selstr; - $catlinks .= ': <select name="currcat_'.$deeper.'">'. - '<option value="" selected="selected">'. - &mt('Select').'</option>'; + my $buttontext = &mt('Show subcategories'); + $selitem = 'currcat_'.$deeper; + $catlinks .= ': <select name="'.$selitem.'">'; + if (@{$cats[$deeper]{$cat}} > 1) { + $catlinks .= '<option value="" selected="selected">'. + &mt('Select').'</option>'; + $buttontext = &mt('Pick subcategory'); + } 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". - ' <input type="submit" name="gocats" value="'.&mt('Change').'" />'; + ' <input type="submit" name="gocats" value="'. + $buttontext.'" />'; + } elsif ($cat ne 'instcode') { + $catlinks .= ' '.&mt('(No subcategories)'); } } $catlinks .= $currcat_str.'</td></tr></table></td>'; - return ($catlinks,$has_subcats); + return ($catlinks,$has_subcats,$selitem); } sub get_depth_values { @@ -492,8 +565,8 @@ sub additional_filters { $output .= '<tr><td><label>'. '<input type="checkbox" name="withsubcats" value="1" '. $include_subcat_status.'/>'. - &mt('Include subcategories within "[_1]"',$catname). - '</label></td></tr>'; + &mt('Include subcategories within "[_1]"', + &unescape($catname)).'</label></td></tr>'; } } my $show_selfenroll_status; @@ -738,9 +811,10 @@ sub print_course_listing { my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$domain); $output .= &construct_data_table($knownuser,\%courses,$details,undef,$now,\%domconfig,$trails,$allitems); - if ($env{'form.coursenum'} ne '') { - $output .= &Apache::lonhtmlcommon::echo_form_input(['coursenum','state','catalogfilter','sortby','showdetails']); - } + $output .= "\n".'<form name="linklaunch" method="post" action="">'. + '<input type="hidden" name="backto" value="coursecatalog" />'. + '<input type="hidden" name="courseid" value="" />'. + &Apache::lonhtmlcommon::echo_form_input(['catalogfilter','courseid']).'</form>'; return $output; } @@ -782,7 +856,7 @@ sub construct_data_table { $output .= '<th>'.&mt('Default Access Dates for Students').'</th>'. '<th>'.&mt('Student Counts').'</th>'. - '<th>'.&mt('Auto-enrollment of <br />registered students').'</th>'; + '<th>'.&mt('Auto-enrollment of[_1]registered students','<br />').'</th>'; } else { $output .= '<th>'.&mt('Details').'</th>'; } @@ -841,7 +915,7 @@ sub build_courseinfo_hash { $cleandesc=~s/'/\\'/g; $cleandesc =~ s/^\s+//; my ($cdom,$cnum)=split(/\_/,$course); - my ($descr,$instcode,$singleowner,$ttype,$selfenroll_types, + my ($instcode,$singleowner,$ttype,$selfenroll_types, $selfenroll_start,$selfenroll_end,@owners,%ownernames,$categories); if (ref($courses->{$course}) eq 'HASH') { $descr = $courses->{$course}{'description'}; @@ -929,10 +1003,10 @@ sub build_courseinfo_hash { } } if ($startaccess) { - $accessdates .= &mt('<i>From:</i> ').$startaccess.'<br />'; + $accessdates .= '<i>'.&mt('From:[_1]','</i> '.$startaccess).'<br />'; } if ($endaccess) { - $accessdates .= &mt('<i>To:</i> ').$endaccess.'<br />'; + $accessdates .= '<i>'.&mt('To:[_1]','</i> '.$endaccess).'<br />'; } if (($selfenroll_types ne '') && ($selfenroll_end > 0 && $selfenroll_end > $now)) { @@ -953,10 +1027,10 @@ sub build_courseinfo_hash { if ($selfenroll_start_access || $selfenroll_end_access) { $accessdates .= '<br/><br /><i>'.&mt('Self-enrollers:').'</i><br />'; if ($selfenroll_start_access) { - $accessdates .= &mt('<i>From:</i> ').$selfenroll_start_access.'<br />'; + $accessdates .= '<i>'.&mt('From:[_1]','</i> '.$selfenroll_start_access).'<br />'; } if ($selfenroll_end_access) { - $accessdates .= &mt('<i>To:</i> ').$selfenroll_end_access.'<br />'; + $accessdates .= '<i>'.&mt('To:[_1]','</i> '.$selfenroll_end_access).'<br />'; } } } @@ -991,10 +1065,10 @@ sub count_students { $student_count{$data->[$idx{'status'}]} ++; } - my $countslist = &mt('[quant,_1,section]',$numsec).':<br />'; + my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'<br />'; foreach my $status ('Active','Future') { - $countslist .= '<nobr>'.$status_title{$status}.': '. - $student_count{$status}.'</nobr><br />'; + $countslist .= '<span class="LC_nobreak">'.$status_title{$status}.': '. + $student_count{$status}.'</span><br />'; } return $countslist; } @@ -1043,7 +1117,7 @@ sub courseinfo_row { '<td>'.$xlist_items.'</td>'. '<td>'.$title.' <font size="-2">'; if ($showsyllabus) { - $output .= &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$cnum,$cdom); + $output .= '<a href="javascript:ToSyllabus('."'$cdom','$cnum'".')">'.&mt('Syllabus').'</a>'; } else { $output .= ' '; } @@ -1067,7 +1141,7 @@ sub courseinfo_row { if (($info->{'selfenroll_start'} > 0) && ($info->{'selfenroll_start'} > $now)) { $output .= '<td>'.&mt('Starts: [_1]','<span class="LC_cusr_emph">'.$showstart.'</span>').'<br />'.&mt('Ends: [_1]','<span class="LC_cusr_emph">'.$showend.'</span>').'</td>'; } else { - $output .= '<td><a href="/adm/selfenroll?cid='.$course.'">'.&mt('Enroll in course').'</a></td>'; + $output .= '<td><a href="javascript:ToSelfenroll('."'$course'".')">'.&mt('Enroll in course').'</a></td>'; } $selfenroll = 1; } @@ -1097,7 +1171,7 @@ sub identify_sections { } } @secnums = sort {$a <=> $b} @secnums; - my $seclist = join(', ',@secnums); + $seclist = join(', ',@secnums); my $numsec = @secnums; return ($seclist,$numsec); } @@ -1134,11 +1208,11 @@ sub get_valid_classes { } if ($totalitems > 0) { if (@{$validations{'sections'}}) { - $response = &mt('Sections: '). + $response = &mt('Sections:').' '. join(', ',@{$validations{'sections'}}).'<br />'; } if (@{$validations{'xlists'}}) { - $response .= &mt('Courses: '). + $response .= &mt('Courses:').' '. join(', ',@{$validations{'xlists'}}); } } @@ -1303,17 +1377,20 @@ sub autoenroll_info { &get_valid_classes($seclist,$xlist_items,$code, $owners,$cdom,$cnum); if ($valid_classes ne '') { - $autoenrolldates = &mt('Not enabled<br />Starts: '). - $autostart.'<br />'.$valid_classes; } + $autoenrolldates = &mt('Not enabled').'<br />' + .&mt('Starts: [_1]',$autostart) + .'<br />'.$valid_classes; + } } } else { if ($coursehash->{'internal.autoend'} && $coursehash->{'internal.autoend'} < $now) { - $autoenrolldates = &mt('Not enabled<br />Ended: ').$autoend; + $autoenrolldates = &mt('Not enabled').'<br />' + .&mt('Ended: [_1]',$autoend); } else { my $valid_classes = &get_valid_classes($seclist,$xlist_items, $code,$owners,$cdom,$cnum); if ($valid_classes ne '') { - $autoenrolldates = &mt('Currently enabled<br />'). + $autoenrolldates = &mt('Currently enabled').'<br />'. $valid_classes; } }