--- loncom/interface/coursecatalog.pm 2008/09/23 13:14:32 1.42 +++ loncom/interface/coursecatalog.pm 2009/10/23 16:14:43 1.56 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for displaying the course catalog interface # -# $Id: coursecatalog.pm,v 1.42 2008/09/23 13:14:32 bisitz Exp $ +# $Id: coursecatalog.pm,v 1.56 2009/10/23 16:14:43 bisitz 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) { @@ -123,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++) { @@ -160,7 +174,7 @@ sub course_details { my $js = ''."\n"; my $start_page = - &Apache::loncommon::start_page('Course Catalog',$js, + &Apache::loncommon::start_page('Course/Community Catalog',$js, { 'add_entries' => \%add_entries, 'no_inline_link' => 1,}); @@ -168,13 +182,13 @@ sub course_details { if ($env{'form.numtitles'} > 0) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursecatalog", - text=>"Select courses"}); + text=>"Course/Community Catalog"}); } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:document.$formname.submit()", text=>"Course listing"}, {text=>"Course details"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog')); $r->print('
'.&mt('Detailed course information:').'

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

'); @@ -212,7 +226,6 @@ function ToSelfenroll(courseid) { END } - sub instcode_course_selector { my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs) = @_; my %coursecodes = (); @@ -220,79 +233,17 @@ sub instcode_course_selector { my @codetitles = (); my %cat_titles = (); my %cat_order = (); - 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 %add_entries = (topmargin => "0", marginheight => "0",); - my $js; - $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom); - if ($totcodes > 0) { - $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; - } - if ($numtitles == 0) { - if (!defined($env{'form.state'})) { - $env{'form.state'} = 'listing'; - } - } else { - 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-1; $i++) { - if ($env{'form.'.$codetitles[$i]} != -1) { - $jscript .= ' - for (var j=0; j'; + if ($totcodes) { if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) { $add_entries{'onLoad'} = 'setElements()'; } @@ -304,43 +255,9 @@ function setElements() { ''. &additional_filters($codedom)); if ($numtitles > 0) { - $r->print(''.&mt('Choose which course(s) to list.').'
'); - $r->print(''); - for (my $k=0; $k<$lasttitle-1; $k++) { - my (@items,@unsorted); - if (ref($cat_items{$codetitles[$k]}) eq 'ARRAY') { - @unsorted = @{$cat_items{$codetitles[$k]}}; - } - &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 = @items; - } - $r->print(''); - } - $r->print('
'.$codetitles[$k].'
'."\n". - '
'.$codetitles[$lasttitle-1].'
'."\n". - ''."\n". - '
'."\n"); - if ($numtitles > 4) { - $r->print('

'.$codetitles[$numtitles-1].'
'."\n". - '
'."\n"); - } - $r->print('
'); + $r->print(''.&mt('Choose which course(s) to list.').'
'. + &Apache::courseclassifier::build_instcode_selectors($numtitles, + $lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order)); } $r->print(''."\n". ''."\n". @@ -351,6 +268,7 @@ function setElements() { '

'); } else { + $js = ''; &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles); my $cat_maxdepth = $env{'form.catalog_maxdepth'}; $r->print('
'. @@ -365,7 +283,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,}); @@ -374,62 +292,84 @@ sub cat_header { if ($numtitles > 0) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursecatalog", - text=>"Select courses"}, + text=>"Course/Community Catalog"}, {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')); + text=>"Course/Community Catalog"}); + } + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog')); + my $onchange; + unless ($env{'form.interface'} eq 'textual') { + $onchange = 'this.form.submit()'; } $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]; @@ -443,7 +383,8 @@ sub category_breadcrumbs { $catlinks .= ''."\n"; } $catlinks .= ''."\n". - ' '; + ' '; } } else { $catlinks .= &mt('Official courses (with institutional codes)'). @@ -463,24 +404,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 { @@ -569,113 +517,9 @@ sub user_is_dc { return; } -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 search_official_courselist { my ($domain,$numtitles) = @_; - my $instcode; - if (defined($numtitles) && $numtitles == 0) { - $instcode = '.+'; - } else { - my (%codedefaults,@code_order); - my $defaults_result = - &Apache::lonnet::auto_instcode_defaults($domain,\%codedefaults, - \@code_order); - if ($defaults_result eq 'ok') { - $instcode ='^'; - foreach my $item (@code_order) { - if ($env{'form.'.$item} eq '0' ) { - $instcode .= $codedefaults{$item}; - } else { - $instcode .= $env{'form.'.$item}; - } - } - $instcode .= '$'; - } else { - $instcode = '.'; - } - } + my $instcode = &Apache::courseclassifier::instcode_search_str($domain,$numtitles); my $showhidden; if (&user_is_dc($domain)) { $showhidden = $env{'form.showhidden'}; @@ -888,7 +732,7 @@ sub build_courseinfo_hash { } } foreach my $owner (@owners) { - my ($ownername,$ownerdom) = @_; + my ($ownername,$ownerdom); if ($owner =~ /:/) { ($ownername,$ownerdom) = split(/:/,$owner); } else { @@ -1019,10 +863,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; } @@ -1173,145 +1017,6 @@ sub get_valid_classes { return $response; } -sub javascript_select_filler { - my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist) = @_; - my $output = < -1) { - document.$formname.Number.options[0] = new Option('All','0',false,false); - for (var k=0; k -1) { - for (var i=0; i -1) { - for (var i=0; i -1) { - for (var k=0; k