--- loncom/interface/courseclassifier.pm 2009/07/29 22:32:44 1.8 +++ loncom/interface/courseclassifier.pm 2019/07/23 13:58:53 1.27 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utilities for classifying courses based on institutional code # -# $Id: courseclassifier.pm,v 1.8 2009/07/29 22:32:44 raeburn Exp $ +# $Id: courseclassifier.pm,v 1.27 2019/07/23 13:58:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,29 +30,17 @@ package Apache::courseclassifier; use strict; use lib '/home/httpd/lib/perl/'; use Apache::lonnet; +use Apache::loncommon; use Apache::lonlocal; use LONCAPA; -sub retrieve_instcodes { - my ($coursecodes,$codedom) = @_; - my $totcodes; - my %courses = &Apache::lonnet::courseiddump($codedom,'.',1,'.','.','.', undef,undef,'Course'); - foreach my $course (keys(%courses)) { - if (ref($courses{$course}) eq 'HASH') { - $$coursecodes{$course} = $courses{$course}{'inst_code'}; - $totcodes ++; - } - } - return $totcodes; -} - sub sort_cats { my ($num,$cat_order,$codetitles,$idsarrayref,$sorted) = @_; my @unsorted = @{$idsarrayref}; if (defined($$cat_order{$$codetitles[$num]})) { foreach my $item (@{$$cat_order{$$codetitles[$num]}}) { if (grep/^\Q$item\E$/,@unsorted) { - push @{$sorted}, $item; + push(@{$sorted},$item); } } } else { @@ -144,7 +132,7 @@ sub build_code_selections { for (my $i=1; $i<@{$codetitles}; $i++) { %{$idarrays{$$codetitles[$i]}} = (); } - foreach my $cid (sort keys %{$codes}) { + foreach my $cid (sort(keys(%{$codes}))) { &recurse_list($cid,$codetitles,$codes,0,\%idarrays); } for (my $num=0; $num<@{$codetitles}; $num++) { @@ -165,7 +153,7 @@ sub build_code_selections { } elsif ($num == 1) { %{$$idlist{$$codetitles[1]}} = (); %{$$idlist_titles{$$codetitles[1]}} = (); - foreach my $key_a (keys %{$idarrays{$$codetitles[1]}}) { + foreach my $key_a (keys(%{$idarrays{$$codetitles[1]}})) { my @sorted_a = (); my @sorted_a_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[1]}{$key_a}},\@sorted_a); @@ -183,10 +171,10 @@ sub build_code_selections { } elsif ($num == 2) { %{$$idlist{$$codetitles[2]}} = (); %{$$idlist_titles{$$codetitles[2]}} = (); - foreach my $key_a (keys %{$idarrays{$$codetitles[2]}}) { + foreach my $key_a (keys(%{$idarrays{$$codetitles[2]}})) { %{$$idlist{$$codetitles[2]}{$key_a}} = (); %{$$idlist_titles{$$codetitles[2]}{$key_a}} = (); - foreach my $key_b (keys %{$idarrays{$$codetitles[2]}{$key_a}}) { + foreach my $key_b (keys(%{$idarrays{$$codetitles[2]}{$key_a}})) { my @sorted_b = (); my @sorted_b_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[2]}{$key_a}{$key_b}},\@sorted_b); @@ -204,11 +192,11 @@ sub build_code_selections { } } elsif ($num == 3) { %{$$idlist{$$codetitles[3]}} = (); - foreach my $key_a (keys %{$idarrays{$$codetitles[3]}}) { + foreach my $key_a (keys(%{$idarrays{$$codetitles[3]}})) { %{$$idlist{$$codetitles[3]}{$key_a}} = (); - foreach my $key_b (keys %{$idarrays{$$codetitles[3]}{$key_a}}) { + foreach my $key_b (keys(%{$idarrays{$$codetitles[3]}{$key_a}})) { %{$$idlist{$$codetitles[3]}{$key_a}{$key_b}} = (); - foreach my $key_c (keys %{$idarrays{$$codetitles[3]}{$key_a}{$key_b}}) { + foreach my $key_c (keys(%{$idarrays{$$codetitles[3]}{$key_a}{$key_b}})) { my @sorted_c = (); my @sorted_c_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[3]}{$key_a}{$key_b}{$key_c}},\@sorted_c); @@ -227,13 +215,13 @@ sub build_code_selections { } } elsif ($num == 4) { %{$$idlist{$$codetitles[4]}} = (); - foreach my $key_a (keys %{$idarrays{$$codetitles[4]}}) { + foreach my $key_a (keys(%{$idarrays{$$codetitles[4]}})) { %{$$idlist{$$codetitles[4]}{$key_a}} = (); - foreach my $key_b (keys %{$idarrays{$$codetitles[4]}{$key_a}}) { + foreach my $key_b (keys(%{$idarrays{$$codetitles[4]}{$key_a}})) { %{$$idlist{$$codetitles[4]}{$key_a}{$key_b}} = (); - foreach my $key_c (keys %{$idarrays{$$codetitles[4]}{$key_a}{$key_b}}) { + foreach my $key_c (keys(%{$idarrays{$$codetitles[4]}{$key_a}{$key_b}})) { %{$$idlist{$$codetitles[4]}{$key_a}{$key_b}{$key_c}} = (); - foreach my $key_d (keys %{$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}}) { + foreach my $key_d (keys(%{$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}})) { my @sorted_d = (); my @sorted_d_titles = (); &sort_cats($num,$cat_order,$codetitles,$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d},\@sorted_d); @@ -256,14 +244,20 @@ sub build_code_selections { } sub javascript_code_selections { - my ($formname,@codetitles) = @_; + my ($formname,$codetitlesref,$knowncodes,$sectionlist) = @_; + return unless (ref($codetitlesref) eq 'ARRAY'); + my @codetitles = @{$codetitlesref}; my $numtitles = @codetitles; + my %lt = &Apache::lonlocal::texthash( + Select => 'Select', + Pick => 'Pick', + ); my $output = (< 0)) { + my @standardnames = &Apache::loncommon::get_standard_codeitems(); + my (%local_to_standard,$currstr); + for (my $i=0; $i<@codetitles; $i++) { + $local_to_standard{$codetitles[$i]} = $standardnames[$i]; + } + $output .= <<"ENDJS"; + +function initialize_codes() { +ENDJS + for (my $i=0; $i<@codetitles-1; $i++) { + my $item = $local_to_standard{$codetitles[$i]}; + $currstr .= $knowncodes->{$codetitles[$i]}; + if ($knowncodes->{$codetitles[$i]} != -1) { + $output .= ' + for (var j=0; j{$codetitles[$i]}.'") { + document.'.$formname.'.'.$item.'.selectedIndex = j; + } + } +'; + } + $output .= ' courseSet('."'$codetitles[$i]'".')'."\n"; + } + my $lastcodetitle = $local_to_standard{$codetitles[-1]}; + $currstr .= $knowncodes->{$codetitles[-1]}; + if ($knowncodes->{$codetitles[-1]} != -1) { + $output .= ' + for (var j=0; j{$codetitles[-1]}.'") { + document.'.$formname.'.'.$lastcodetitle.'.selectedIndex = j; + } + } +'; + } + $output .= " return;\n}\n"; + if ($sectionlist) { + $output .= ' +function toggleSecVis() { + var currcode = ""; + var crscode = '."'$currstr'".'; +'; + for (my $i=0; $i<@codetitles-1; $i++) { + my $item = $local_to_standard{$codetitles[$i]}; + $output .= 'currcode += document.'.$formname.'.'.$item.'.options[document.'.$formname.'.'.$item.'.selectedIndex].value;'."\n"; + } + my $lastcodetitle = $local_to_standard{$codetitles[-1]}; + if ($lastcodetitle ne '') { + if ($knowncodes->{$codetitles[-1]} != -1) { + $output .= 'currcode += document.'.$formname.'.'.$lastcodetitle.'.options[document.'.$formname.'.'.$lastcodetitle.'.selectedIndex].value;'."\n"; + } + } + $output .= <<"ENDSEC"; + var showlist = 'none'; + var showbox = 'inline'; + if ((crscode != '') && (currcode == crscode)) { + showlist = 'inline'; + showbox = 'none'; + } + alert("crscode is ||"+crscode+"|| and currcode is ||"+currcode+"|| and showlist is ||"+showlist+"|| and showbox is ||"+showbox+"||"); + if (document.getElementById('LC_helpdesk_sectionlist')) { + document.getElementById('LC_helpdesk_sectionlist').style.display = showlist; + } + if (document.getElementById('LC_helpdesk_section')) { + document.getElementById('LC_helpdesk_section').style.display = showbox; + } + return; +} + +ENDSEC + + } + } else { + $output .= <<"END_OF_JS"; function initialize_codes() { courseSet(); return; } -END_OF_BLOCK +END_OF_JS + } + return $output; } - sub javascript_definitions { my ($codetitles,$idlist,$idlist_titles,$idnums,$cat_titles) = @_; my $numtitles = @{$codetitles}; @@ -446,15 +517,18 @@ END sub instcode_selectors_data { my ($codedom,$formname,$cat_items,$codetitles,$cat_titles,$cat_order,$officialjs) = @_; - my ($jscript,%coursecodes,%codes,%idlist,%idnums,%idlist_titles, - %by_year,%by_sem,%by_dept); - my ($numtitles,$lasttitle); - my $caller = 'global'; - my $totcodes = &retrieve_instcodes(\%coursecodes,$codedom); - if ($totcodes > 0) { - if (&Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes, - \%codes,$codetitles,$cat_titles,$cat_order) eq 'ok') { - &build_code_selections(\%codes,$codetitles,$cat_titles,$cat_order, + my ($jscript,$codes,%idlist,%idnums,%idlist_titles,%by_year,%by_sem,%by_dept); + my ($numtitles,$lasttitle,$totcodes); + my $instcats = &Apache::lonnet::get_dom_instcats($codedom); + if (ref($instcats) eq 'HASH') { + if ((ref($instcats->{'codetitles'}) eq 'ARRAY') && (ref($instcats->{'codes'}) eq 'HASH') && + (ref($instcats->{'cat_titles'}) eq 'HASH') && (ref($instcats->{'cat_order'}) eq 'HASH')) { + %{$codes} = %{$instcats->{'codes'}}; + @{$codetitles} = @{$instcats->{'codetitles'}}; + %{$cat_titles} = %{$instcats->{'cat_titles'}}; + %{$cat_order} = %{$instcats->{'cat_order'}}; + $totcodes = scalar(keys(%{$codes})); + &build_code_selections($codes,$codetitles,$cat_titles,$cat_order, \%idlist,\%idnums,\%idlist_titles); my ($scripttext,$longtitles) = &javascript_definitions($codetitles,\%idlist,\%idlist_titles, @@ -481,12 +555,27 @@ sub instcode_selectors_data { if ($officialjs) { $jscript .= ' -function toggleOfficial() {'; +function toggleOfficial() { + var choice; + for (var i=0; i[$i].'.selectedIndex = 0;'; + document.'.$formname.'.'.$codetitles->[$i].'.selectedIndex = 0;'; } - $jscript .= ' + $jscript .= ' + } else { + if (document.getElementById("instcodes")) { + document.getElementById("instcodes").style.display = "block"; + } + } } function setOfficial(caller) { @@ -510,26 +599,35 @@ function setOfficial(caller) { } $jscript .= &javascript_select_filler($formname,$scripttext,$codetitles,$longtitles_str,$allidlist,$officialjs); if ($env{'form.state'} eq 'listing') { + my @standardnames = &Apache::loncommon::get_standard_codeitems(); + my %local_to_standard; + if (ref($codetitles) eq 'ARRAY') { + for (my $i=0; $i<@{$codetitles}; $i++) { + $local_to_standard{$codetitles->[$i]} = $standardnames[$i]; + } + } $jscript .= ' function setElements() { '; for (my $i=0; $i<@{$codetitles}-1; $i++) { - if ($env{'form.'.$codetitles->[$i]} != -1) { + my $item = $local_to_standard{$codetitles->[$i]}; + if ($env{'form.'.$item} != -1) { $jscript .= ' - for (var j=0; j[$i].'.length; j++) { - if (document.'.$formname.'.'.$codetitles->[$i].'[j].value == "'.$env{'form.'.$codetitles->[$i]}.'") { - document.'.$formname.'.'.$codetitles->[$i].'.selectedIndex = j; + for (var j=0; j[-1]} != -1) { + my $lastcodetitle = $local_to_standard{$codetitles->[-1]}; + if ($env{'form.'.$lastcodetitle} != -1) { $jscript .= ' - for (var j=0; j[-1].'.length; j++) { - if (document.'.$formname.'.'.$codetitles->[-1].'[j].value == "'.$env{'form.'.$codetitles->[-1]}.'") { - document.'.$formname.'.'.$codetitles->[-1].'.selectedIndex = j; + for (var j=0; j 0) { - $output .= ''; + my $style; + if ($official eq 'off') { + $style = ' style="display: none"'; + } + if ($id eq '') { + $id = 'instcodes'; + } + my $disabled; + if ($noedit) { + $disabled = ' disabled="disabled"'; + } + $output .= '
'; for (my $k=0; $k<$lasttitle-1; $k++) { my (@items,@unsorted); if (ref($cat_items->{$codetitles->[$k]}) eq 'ARRAY') { @@ -562,8 +672,11 @@ sub build_instcode_selectors { @longitems = @items; } $output .= ''; } $output .= '
'.$codetitles->[$k].'
'."\n". - ''."\n".''."\n"; for (my $i=0; $i<@items; $i++) { if ($longitems[$i] eq '') { $longitems[$i] = $items[$i]; @@ -573,20 +686,51 @@ sub build_instcode_selectors { $output .= '
'.$codetitles->[$lasttitle-1].'
'."\n". - ''."\n". ''."\n".''."\n". '
'."\n"; if ($numtitles > 4) { $output .= '

'.$codetitles->[$numtitles-1].'
'."\n". - '
'."\n"; + '
'."\n"; } - $output .= '
'; + $output .= ''; } return $output; } +sub instcode_selectors { + my ($codedom,$formname,$officialjs,$codetitles) = @_; + my ($output,%cat_titles,%cat_order,%cat_items); + my ($jscript,$totcodes,$numtitles,$lasttitle) = + &instcode_selectors_data($codedom,$formname,\%cat_items,$codetitles, + \%cat_titles,\%cat_order,$officialjs); + if ($numtitles > 0) { + my $official = ' checked="checked" '; + my $unofficial = ''; + if (($formname eq 'filterpicker') && ($env{'form.official'} eq 'off')) { + $unofficial = $official; + $official = ''; + } + $output .= ''.&mt('Official course:').' '. + (' 'x3).'
'. + &build_instcode_selectors($numtitles,$lasttitle,\%cat_items,$codetitles, + \%cat_titles,\%cat_order,$env{'form.official'})."\n". + ''."\n". + ''."\n"; + } + return ($output,$jscript,$numtitles); +} + sub recurse_options { my ($currkey,$currlist,$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept) = @_; if (ref($currlist) eq 'HASH') { @@ -623,7 +767,8 @@ sub build_javascript { my ($by_year,$by_sem,$by_dept,$cat_order,$codetitles) = @_; my @unsorted = keys(%{$by_year}); my @sorted_yrs; - &sort_cats('0',$cat_order,$codetitles,\@unsorted,\@sorted_yrs); my $output = 'var idcse_by_yr_year = new Array("'.join('","',@sorted_yrs).'");'."\n". + &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++) { @@ -671,14 +816,27 @@ sub build_javascript { sub javascript_select_filler { my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist,$officialjs) = @_; + my $all = &mt('All'); + my $nocrs = &mt('No courses'); my $output = < 0) { + for (var i = 0; i< document.$formname.Year.options.length; i++) { + if (document.$formname.Year.options[i].value == "$env{'form.Year'}") { + document.$formname.Year.selectedIndex = i; + break; + } + } + } + if (document.$formname.Department.options.length > 0) { + for (var i = 0; i< document.$formname.Department.options.length; i++) { + if (document.$formname.Department.options[i].value == "$env{'form.Department'}") { + document.$formname.Department.selectedIndex = i; + break; + } + } + } + if (document.$formname.Semester.options.length > 0) { + for (var i = 0; i< document.$formname.Semester.options.length; i++) { + if (document.$formname.Semester.options[i].value == "$env{'form.Semester'}") { + document.$formname.Semester.selectedIndex = i; + break; + } + } + } + } + + var selYear = document.$formname.Year.selectedIndex-1; + var selSemester = document.$formname.Semester.selectedIndex-1; + var 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); + document.$formname.Number.options[0] = new Option('$all','0',false,false); for (var k=0; k 0) { + for (var i = 0; i< document.$formname.Number.options.length; i++) { + if (document.$formname.Number.options[i].value == "$env{'form.Number'}") { + document.$formname.Number.selectedIndex = i; + break; + } + } + } + } else { + $officialjs + } } END return $output; } sub instcode_search_str { - my ($domain,$numtitles) = @_; + my ($domain,$numtitles,$codetitles) = @_; my $instcode; if (defined($numtitles) && $numtitles == 0) { $instcode = '.+'; @@ -820,13 +1016,25 @@ sub instcode_search_str { my $defaults_result = &Apache::lonnet::auto_instcode_defaults($domain,\%codedefaults, \@code_order); + my @standardnames = &Apache::loncommon::get_standard_codeitems(); + my %local_to_standard; + if (ref($codetitles) eq 'ARRAY') { + for (my $i=0; $i<@{$codetitles}; $i++) { + $local_to_standard{$codetitles->[$i]} = $standardnames[$i]; + } + } if ($defaults_result eq 'ok') { $instcode ='^'; - foreach my $item (@code_order) { - if ($env{'form.'.$item} eq '0' ) { - $instcode .= $codedefaults{$item}; + foreach my $loctitle (@code_order) { + my $item = $local_to_standard{$loctitle}; + if ($item ne '') { + if ($env{'form.'.$item} eq '0' ) { + $instcode .= $codedefaults{$loctitle}; + } else { + $instcode .= $env{'form.'.$item}; + } } else { - $instcode .= $env{'form.'.$item}; + $instcode .= '.+'; } } $instcode .= '$'; @@ -835,6 +1043,45 @@ sub instcode_search_str { } } return $instcode; +} + +sub instcode_from_selectors { + my ($cdom,$noregexps) = @_; + my $instcode; + my (@codetitles,%codedefaults,@code_order); + my $instcats = &Apache::lonnet::get_dom_instcats($cdom); + if (ref($instcats) eq 'HASH') { + if (ref($instcats->{'codetitles'}) eq 'ARRAY') { + @codetitles = @{$instcats->{'codetitles'}}; + } + } + my $defaults_result = + &Apache::lonnet::auto_instcode_defaults($cdom,\%codedefaults, + \@code_order); + if (($defaults_result eq 'ok') && (@codetitles > 0)) { + my @standardnames = &Apache::loncommon::get_standard_codeitems(); + my %local_to_standard; + for (my $i=0; $i<@codetitles; $i++) { + $local_to_standard{$codetitles[$i]} = $standardnames[$i]; + } + foreach my $loctitle (@code_order) { + my $category = $local_to_standard{$loctitle}; + if ($category ne '') { + if ($env{'form.'.$category} eq '-1' ) { + if ($noregexps) { + $instcode .= ' '; + } else { + $instcode .= $codedefaults{$category}; + } + } else { + $instcode .= $env{'form.'.$category}; + } + } else { + $instcode .= '.+'; + } + } + } + return $instcode; } 1;