[LON-CAPA-cvs] cvs: loncom /interface coursecatalog.pm
raeburn
lon-capa-cvs@mail.lon-capa.org
Thu, 12 Oct 2006 23:15:34 -0000
This is a MIME encoded message
--raeburn1160694934
Content-Type: text/plain
raeburn Thu Oct 12 19:15:34 2006 EDT
Modified files:
/loncom/interface coursecatalog.pm
Log:
Using routines from courseclassifier instead of lonsupportreq. All ipossible values are now displayed in select boxes for Year, Semester and Department. Options available in "Number" select box are set dynamically if a specific Department is selected. Choices will vary depending on current selections for Year and Semester.
--raeburn1160694934
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20061012191534.txt"
Index: loncom/interface/coursecatalog.pm
diff -u loncom/interface/coursecatalog.pm:1.5 loncom/interface/coursecatalog.pm:1.6
--- loncom/interface/coursecatalog.pm:1.5 Sun Sep 24 20:16:56 2006
+++ loncom/interface/coursecatalog.pm Thu Oct 12 19:15:33 2006
@@ -30,7 +30,7 @@
use Apache::loncommon;
use Apache::lonnet;
use Apache::lonlocal;
-use Apache::lonsupportreq;
+use Apache::courseclassifier;
use Apache::lonacc;
use lib '/home/httpd/lib/perl/';
use LONCAPA;
@@ -46,7 +46,6 @@
&Apache::lonlocal::get_language_handle($r);
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
my $codedom = $Apache::lonnet::perlvar{'lonDefDomain'};
- my $ccode = '';
my %coursecodes = ();
my %codes = ();
my @codetitles = ();
@@ -55,27 +54,44 @@
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 $formname = 'coursecatalog';
my $domdesc = $Apache::lonnet::domaindescription{$codedom};
- $totcodes = &Apache::lonsupportreq::retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
+ $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
if ($totcodes > 0) {
- if ($ccode eq '') {
- $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::lonsupportreq::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
- &Apache::lonsupportreq::javascript_code_selections($formname,$numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles);
+ $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;
}
+ 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; $i++) {
+ for (my $i=0; $i<@codetitles-1; $i++) {
if ($env{'form.'.$codetitles[$i]} != -1) {
$jscript .= '
for (var j=0; j<document.'.$formname.'.'.$codetitles[$i].'.length; j++) {
@@ -84,11 +100,18 @@
}
}
';
- $jscript .= ' courseSet('."'$codetitles[$i]'".');'."\n";
- } else {
- last;
}
}
+ $jscript .= ' courseSet()'."\n";
+ if ($env{'form.'.$codetitles[-1]} != -1) {
+ $jscript .= '
+ for (var j=0; j<document.'.$formname.'.'.$codetitles[-1].'.length; j++) {
+ if (document.'.$formname.'.'.$codetitles[-1].'[j].value == "'.$env{'form.'.$codetitles[-1]}.'") {
+ document.'.$formname.'.'.$codetitles[-1].'.selectedIndex = j;
+ }
+ }
+';
+ }
$jscript .= '}';
$jscript .= qq|
function changeSort(caller) {
@@ -108,58 +131,44 @@
'no_inline_link' => 1,});
$r->print($start_page);
- my $numtitles = @codetitles;
$r->print('<h3>'.&mt('Display information about official [_1] classes for which LON-CAPA courses have been created:',$domdesc).'</h3>');
$r->print(&mt('<b>Choose which course(s) to list.</b><br />'));
$r->print('<form name="coursecatalog" method="post">');
if ($numtitles > 0) {
- my $lasttitle = $numtitles;
- if ($numtitles > 4) {
- $lasttitle = 4;
- }
- $r->print('<table><tr><td>'.$codetitles[0].'<br />'."\n".
- '<select name="'.$codetitles[0].'" onChange="courseSet('."'$codetitles[0]'".')">'."\n".
- ' <option value="-1" />Select'."\n");
- my @items = ();
- my @longitems = ();
- if ($idlist{$codetitles[0]} =~ /","/) {
- @items = split(/","/,$idlist{$codetitles[0]});
- } else {
- $items[0] = $idlist{$codetitles[0]};
- }
- if (defined($idlist_titles{$codetitles[0]})) {
- if ($idlist_titles{$codetitles[0]} =~ /","/) {
- @longitems = split(/","/,$idlist_titles{$codetitles[0]});
+ $r->print('<table><tr>');
+ for (my $k=0; $k<$lasttitle-1; $k++) {
+ my @unsorted = @{$cat_items{$codetitles[$k]}};
+ my @items;
+ &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[0] = $idlist_titles{$codetitles[0]};
+ @longitems = @items;
}
- for (my $i=0; $i<@longitems; $i++) {
+ $r->print('<td align="center">'.$codetitles[$k].'<br />'."\n".
+ '<select name="'.$codetitles[$k].'" onChange="courseSet()"');
+ $r->print('>'."\n".'<option value="0" />All'."\n");
+ for (my $i=0; $i<@items; $i++) {
if ($longitems[$i] eq '') {
$longitems[$i] = $items[$i];
}
+ $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
}
- } else {
- @longitems = @items;
+ $r->print('</select></td>');
}
- for (my $i=0; $i<@items; $i++) {
- $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
- }
- $r->print('</select></td>');
- for (my $i=1; $i<$numtitles; $i++) {
- $r->print('<td>'.$codetitles[$i].'<br />'."\n".
- '<select name="'.$codetitles[$i].'" onChange="courseSet('."'$codetitles[$i]'".')">'."\n".
- '<option value="-1"><-Pick '.$codetitles[$i-1].'</option>'."\n".
- '</select>'."\n".
+ $r->print('<td align="center">'.$codetitles[$lasttitle-1].'<br />'."\n".
+ '<select name="'.$codetitles[$lasttitle-1].'">'."\n".
+ '<option value="0">All'."\n".
+ '</option>'."\n".'</select>'."\n".
'</td>'
);
- }
$r->print('</tr></table>');
if ($numtitles > 4) {
- $r->print('<br /><br />'.$codetitles[$numtitles].'<br />'."\n".
- '<select name="'.$codetitles[$numtitles].
- '" onChange="courseSet('."'$codetitles[$numtitles]'".')">'."\n".
- '<option value="-1"><-Pick '.$codetitles[$numtitles-1].
- '</option>'."\n".'</select>'."\n");
+ $r->print('<br /><br />'.$codetitles[$numtitles-1].'<br />'."\n".
+ '<input type="text" name="'.$codetitles[$numtitles-1].'" /><br />'."\n");
}
}
$r->print('<br /><input type="hidden" name="state" value="listing" /><input type="hidden" name="sortby" value="" /><input type="submit" name="catalogfilter" value="'.&mt('Display courses').'" /></form>');
@@ -170,12 +179,96 @@
$r->print('<br />'.&mt('No official courses to display for [_1].',$domdesc));
}
if ($env{'form.state'} eq 'listing') {
- $r->print('<br /><br />'.&print_course_listing($codedom));
+ $r->print('<br /><br />'.&print_course_listing($codedom).'<br />');
}
$r->print(&Apache::loncommon::end_page());
return OK;
}
+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 print_course_listing {
my ($domain) = @_;
my $output;
@@ -184,20 +277,26 @@
my $dept = $env{'form.Department'};
my $coursenum = $env{'form.Number'};
my $instcode;
- if ($sem != -1) {
- $instcode .= $sem;
+ if ($sem eq '0' ) {
+ $instcode .= '^[sfu]s';
+ } else {
+ $instcode .= '^'.$sem;
}
- if ($year != -1) {
+ if ($year eq '0') {
+ $instcode .= '\d{2}';
+ } else {
$instcode .= $year;
}
- if ($dept != -1) {
+ if ($dept eq '0') {
+ $instcode .= '\w{2,3}';
+ } else {
$instcode .= $dept;
}
- if ($coursenum != -1) {
- $instcode .= $coursenum;
+ if ($coursenum ne '0' && $coursenum != -1) {
+ $instcode .= $coursenum.'$';
}
my %courses = &Apache::lonnet::courseiddump($domain,'.',1,$instcode,'.','.',
- undef,undef,'Course');
+ undef,undef,'Course',1);
if (keys(%courses) == 0) {
$output = &mt('No courses match the criteria you selected.');
return $output;
@@ -454,6 +553,138 @@
return $response;
}
+sub javascript_select_filler {
+ my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist) = @_;
+ my $output = <<END;
+function courseSet() {
+ var longtitles = new Array ("$longtitles_str");
+ var valyr = document.$formname.Year.options[document.$formname.Year.selectedIndex].value
+ var valsem = document.$formname.Semester.options[document.$formname.Semester.selectedIndex].value
+ var valdept = document.$formname.Department.options[document.$formname.Department.selectedIndex].value
+ var valclass = document.$formname.Number.options[document.$formname.Number.selectedIndex].value
+ var idyears = new Array("$allidlist");
+ var idyr = -1;
+ var idsem = -1;
+ var iddept = -1;
+ document.$formname.Number.length = 0;
-1;
+ $scripttext
+
+ selYear = document.$formname.Year.selectedIndex-1;
+ selSemester = document.$formname.Semester.selectedIndex-1;
+ 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);
+ for (var k=0; k<idcse_by_dep[selDepartment].length; k++) {
+ document.$formname.Number.options[k+1] = new Option(idcse_by_dep[selDepartment][k],idcse_by_dep[selDepartment][k],false,false);
+ }
+ }
+ else {
+ document.$formname.Number.options[0] = new Option("All","0",true,true);
+ }
+ }
+ else {
+ if (selDepartment > -1) {
+ for (var i=0; i<idcse_by_sem_sems.length; i++) {
+ if (idcse_by_sem_sems[i] == valsem) {
+ idsem = i;
+ }
+ }
+ if (idsem != -1) {
+ for (var i=0; i<idcse_by_sem_dept[idsem].length; i++) {
+ if (idcse_by_sem_dept[idsem][i] == valdept) {
+ iddept = i;
+ }
+ }
+ }
+ if (iddept != -1) {
+ document.$formname.Number.options[0] = new Option('All','0',false,false);
+ for (var k=0; k<idcse_by_sem_num[idsem][iddept].length; k++) {
+ document.$formname.Number.options[k+1] = new Option(idcse_by_sem_num[idsem][iddept][k],idcse_by_sem_num[idsem][iddept][k],false,false);
+ }
+ }
+ else {
+ document.$formname.Number.options[0] = new Option('No courses','0',true,true);
+ }
+ }
+ else {
+ document.$formname.Number.options[0] = new Option("All","0",true,true);
+ }
+ }
+ }
+ else {
+ if (selSemester == -1) {
+ if (selDepartment > -1) {
+ for (var i=0; i<idcse_by_yr_year.length; i++) {
+ if (idcse_by_yr_year[i] == valyr) {
+ idyr = i;
+ }
+ }
+ if (idyr != -1) {
+ for (var i=0; i<idcse_by_yr_dept[idyr].length; i++) {
+ if (idcse_by_yr_dept[idyr][i] == valdept) {
+ iddept = i;
+ }
+ }
+ }
+ if (iddept != -1) {
+ document.$formname.Number.options[0] = new Option('All','0',false,false);
+ for (var k=0; k<idcse_by_yr_num[idyr][iddept].length; k++) {
+ document.$formname.Number.options[k+1] = new Option(idcse_by_yr_num[idyr][iddept][k],idcse_by_yr_num[idyr][iddept][k],false,false);
+ }
+ }
+ else {
+ document.$formname.Number.options[0] = new Option('No courses','0',true,true);
+ }
+ }
+ else {
+ document.$formname.Number.options[0] = new Option("All","0",true,true);
+ }
+ }
+ else {
+ for (var k=0; k<idyears.length; k++) {
+ if (idyears[k] == valyr) {
+ idyr = k;
+ }
+ }
+ if (idyr != -1) {
+ for (var k=0; k<idsems[idyr].length; k++) {
+ if (idsems[idyr][k] == valsem) {
+ idsem = k;
+ }
+ }
+ }
+ if (idsem != -1) {
+ for (var k=0; k<idcodes[idyr][idsem].length; k++) {
+ if (idcodes[idyr][idsem][k] == valdept) {
+ iddept = k;
+ }
+ }
+ }
+ if (iddept != -1) {
+ document.$formname.Number.options[0] = new Option('All','0',false,false);
+ for (var i=0; i<idcourses[idyr][idsem][iddept].length; i++) {
+ var display = idcourses[idyr][idsem][iddept][i];
+ if (longtitles[3] == 1) {
+ if (idcourseslongs[idyr][idsem][iddept][i] != "") {
+ display = idcourseslongs[idyr][idsem][iddept][i]
+ }
+ }
+ document.$formname.Number.options[i+1] = new Option(display,idcourses[idyr][idsem][iddept][i],false,false)
+ }
+ }
+ else {
+ document.$formname.Number.options[0] = new Option('No courses','0',true,true);
+ }
+ }
+ document.$formname.Number.selectedIndex = 0
+ }
+}
+END
+ return $output;
+}
+
+1;
--raeburn1160694934--