--- loncom/interface/coursecatalog.pm 2008/07/13 20:13:10 1.38 +++ loncom/interface/coursecatalog.pm 2009/03/18 20:58:02 1.50 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for displaying the course catalog interface # -# $Id: coursecatalog.pm,v 1.38 2008/07/13 20:13:10 raeburn Exp $ +# $Id: coursecatalog.pm,v 1.50 2009/03/18 20:58:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -90,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) { @@ -106,12 +106,14 @@ function changeSort(caller) { document.$formname.sortby.value = caller; document.$formname.submit(); } + function setCourseId(caller) { document.$formname.coursenum.value = caller; document.$formname.submit(); } ENDSCRIPT + $catjs .= &courselink_javascript(); my $numtitles; if ($env{'form.currcat_0'} eq 'instcode::0') { $numtitles = &instcode_course_selector($r,$codedom,$formname,$domdesc, @@ -121,13 +123,27 @@ ENDSCRIPT } } 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 .= <'; &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks); if ($env{'form.currcat_0'} ne '') { $r->print('
'. &additional_filters($codedom,$has_subcats)."\n"); - my ($currdepth,$deeper) = &get_depth_values(); $r->print(''."\n"); for (my $i=0; $i<$deeper; $i++) { @@ -155,8 +171,10 @@ sub course_details { my $output; my %add_entries = (topmargin => "0", marginheight => "0",); + my $js = ''."\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,}); @@ -172,16 +190,43 @@ sub course_details { {text=>"Course details"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details')); $r->print('
'.&mt('Detailed course information:').'

'. - ''. &print_course_listing($codedom,undef,$trails,$allitems). '

'); - $r->print(''. + $r->print(''. + ''. &mt('Back to course listing').''. - ''. - '
'); + &Apache::lonhtmlcommon::echo_form_input(['coursenum','catalogfilter', + 'showdetails','courseid']).''); + 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 = (); @@ -320,6 +365,7 @@ function setElements() { '

'); } else { + $js = ''; &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles); my $cat_maxdepth = $env{'form.catalog_maxdepth'}; $r->print('
'. @@ -334,7 +380,7 @@ function setElements() { sub cat_header { my ($r,$codedom,$js,$add_entries,$catlinks,$numtitles) = @_; my $start_page = - &Apache::loncommon::start_page('Course Catalog',$js, + &Apache::loncommon::start_page('Other',$js, { 'add_entries' => $add_entries, 'no_inline_link' => 1,}); @@ -356,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 = 1; + } $r->print(''. '
'.&mt('Domain:').''. - &Apache::loncommon::select_dom_form($codedom,'showdom','',1). - ' 
'. - '
'. + &Apache::loncommon::select_dom_form($codedom,'showdom','',1,$onchange)); + if (!$onchange) { + $r->print(' '); + } + $r->print('
'. + '
'. ''.$catlinks.'
'); return; } sub category_breadcrumbs { my ($dom,@cats) = @_; + my $crumbsymbol = ' ▶ '; my ($currdepth,$deeper) = &get_depth_values(); my $currcat_str = ''; my $catlinks = ''.&mt('Catalog:').''; my $has_subcats; + my $selitem; for (my $i=0; $i<$deeper; $i++) { $currcat_str .= ''; 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 .= ''; + if ($cattitle ne '') { + $catlinks .= ''; + } } if ($deeper == 0) { - $catlinks .= '
'.$cattitle.'->'.$cattitle.''.$crumbsymbol.''.&mt('Main Categories').': '; + $catlinks .= ''; if (ref($cats[0]) eq 'ARRAY') { - if ((@{$cats[0]} == 1) && ($cats[0][0] eq 'instcode')) { - $catlinks .= &mt('Official courses (with institutional codes)'). - ''; - $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)'). + ''; + $env{'form.currcat_0'} = 'instcode::0'; + } else { + my $name = $cats[0][0]; + my $item = &escape($name).'::0'; + $catlinks .= $name. + ''; + $env{'form.currcat_0'} = $item; + } } else { $has_subcats = 1; - $catlinks .= ''."\n"; if (@{$cats[0]} > 1) { - my $selstr; - if ($env{'form.currcat_0'} eq '') { - $selstr = ' selected="selected" '; - } - $catlinks .= ''."\n"; + $catlinks .= ''."\n"; + $buttontext = &mt('Pick main category'); } for (my $i=0; $i<@{$cats[0]}; $i++) { my $name = $cats[0][$i]; @@ -412,7 +481,8 @@ sub category_breadcrumbs { $catlinks .= ''."\n"; } $catlinks .= ''."\n". - ' '; + ' '; } } else { $catlinks .= &mt('Official courses (with institutional codes)'). @@ -432,24 +502,31 @@ sub category_breadcrumbs { if ($cat eq 'instcode') { $currcat = &mt('Official courses (with institutional codes)'); } - $catlinks .= ''.$currcat; + $catlinks .= ''.$currcat.''; if (ref($cats[$deeper]{$cat}) eq 'ARRAY') { $has_subcats = 1; - my $selstr; - $catlinks .= ': '; + if (@{$cats[$deeper]{$cat}} > 1) { + $catlinks .= ''; + $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 .= ''."\n"; } $catlinks .= ''."\n". - ' '; + ' '; + } elsif ($cat ne 'instcode') { + $catlinks .= ' '.&mt('(No subcategories)'); } } $catlinks .= $currcat_str.'
'; - return ($catlinks,$has_subcats); + return ($catlinks,$has_subcats,$selitem); } sub get_depth_values { @@ -734,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".'
'. + ''. + ''. + &Apache::lonhtmlcommon::echo_form_input(['catalogfilter','courseid']).'
'; return $output; } @@ -778,7 +856,7 @@ sub construct_data_table { $output .= ''.&mt('Default Access Dates for Students').''. ''.&mt('Student Counts').''. - ''.&mt('Auto-enrollment of
registered students').''; + ''.&mt('Auto-enrollment of[_1]registered students','
').''; } else { $output .= ''.&mt('Details').''; } @@ -837,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'}; @@ -925,10 +1003,10 @@ sub build_courseinfo_hash { } } if ($startaccess) { - $accessdates .= &mt('From: ').$startaccess.'
'; + $accessdates .= ''.&mt('From:[_1]',' '.$startaccess).'
'; } if ($endaccess) { - $accessdates .= &mt('To: ').$endaccess.'
'; + $accessdates .= ''.&mt('To:[_1]',' '.$endaccess).'
'; } if (($selfenroll_types ne '') && ($selfenroll_end > 0 && $selfenroll_end > $now)) { @@ -949,10 +1027,10 @@ sub build_courseinfo_hash { if ($selfenroll_start_access || $selfenroll_end_access) { $accessdates .= '

'.&mt('Self-enrollers:').'
'; if ($selfenroll_start_access) { - $accessdates .= &mt('From: ').$selfenroll_start_access.'
'; + $accessdates .= ''.&mt('From:[_1]',' '.$selfenroll_start_access).'
'; } if ($selfenroll_end_access) { - $accessdates .= &mt('To: ').$selfenroll_end_access.'
'; + $accessdates .= ''.&mt('To:[_1]',' '.$selfenroll_end_access).'
'; } } } @@ -987,10 +1065,10 @@ sub count_students { $student_count{$data->[$idx{'status'}]} ++; } - my $countslist = &mt('[quant,_1,section]',$numsec).':
'; + my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'
'; foreach my $status ('Active','Future') { - $countslist .= ''.$status_title{$status}.': '. - $student_count{$status}.'
'; + $countslist .= ''.$status_title{$status}.': '. + $student_count{$status}.'
'; } return $countslist; } @@ -1039,7 +1117,7 @@ sub courseinfo_row { ''.$xlist_items.''. ''.$title.' '; if ($showsyllabus) { - $output .= &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$cnum,$cdom); + $output .= ''.&mt('Syllabus').''; } else { $output .= ' '; } @@ -1063,7 +1141,7 @@ sub courseinfo_row { if (($info->{'selfenroll_start'} > 0) && ($info->{'selfenroll_start'} > $now)) { $output .= ''.&mt('Starts: [_1]',''.$showstart.'').'
'.&mt('Ends: [_1]',''.$showend.'').''; } else { - $output .= ''.&mt('Enroll in course').''; + $output .= ''.&mt('Enroll in course').''; } $selfenroll = 1; } @@ -1093,7 +1171,7 @@ sub identify_sections { } } @secnums = sort {$a <=> $b} @secnums; - my $seclist = join(', ',@secnums); + $seclist = join(', ',@secnums); my $numsec = @secnums; return ($seclist,$numsec); } @@ -1130,11 +1208,11 @@ sub get_valid_classes { } if ($totalitems > 0) { if (@{$validations{'sections'}}) { - $response = &mt('Sections: '). + $response = &mt('Sections:').' '. join(', ',@{$validations{'sections'}}).'
'; } if (@{$validations{'xlists'}}) { - $response .= &mt('Courses: '). + $response .= &mt('Courses:').' '. join(', ',@{$validations{'xlists'}}); } } @@ -1299,17 +1377,20 @@ sub autoenroll_info { &get_valid_classes($seclist,$xlist_items,$code, $owners,$cdom,$cnum); if ($valid_classes ne '') { - $autoenrolldates = &mt('Not enabled
Starts: '). - $autostart.'
'.$valid_classes; } + $autoenrolldates = &mt('Not enabled').'
' + .&mt('Starts: [_1]',$autostart) + .'
'.$valid_classes; + } } } else { if ($coursehash->{'internal.autoend'} && $coursehash->{'internal.autoend'} < $now) { - $autoenrolldates = &mt('Not enabled
Ended: ').$autoend; + $autoenrolldates = &mt('Not enabled').'
' + .&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
'). + $autoenrolldates = &mt('Currently enabled').'
'. $valid_classes; } }